* bfd-in.h (BFD_LINKER_CREATED): Define.
[deliverable/binutils-gdb.git] / ld / emultempl / ppc64elf.em
CommitLineData
1f808cd5 1# This shell script emits a C file. -*- C -*-
b9cf773d 2# Copyright 2002, 2003, 2004 Free Software Foundation, Inc.
1f808cd5
AM
3#
4# This file is part of GLD, the Gnu Linker.
5#
6# This program is free software; you can redistribute it and/or modify
7# it under the terms of the GNU General Public License as published by
8# the Free Software Foundation; either version 2 of the License, or
9# (at your option) any later version.
10#
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY; without even the implied warranty of
13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14# GNU General Public License for more details.
15#
16# You should have received a copy of the GNU General Public License
17# along with this program; if not, write to the Free Software
18# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19#
20
21# This file is sourced from elf32.em, and defines extra powerpc64-elf
22# specific routines.
23#
24cat >>e${EMULATION_NAME}.c <<EOF
25
9c1d81c1 26#include "ldctor.h"
805fc799 27#include "libbfd.h"
83490352 28#include "elf-bfd.h"
1f808cd5
AM
29#include "elf64-ppc.h"
30
9c1d81c1
AM
31/* Fake input file for stubs. */
32static lang_input_statement_type *stub_file;
68f8ff14 33static int stub_added = 0;
9c1d81c1
AM
34
35/* Whether we need to call ppc_layout_sections_again. */
1f808cd5
AM
36static int need_laying_out = 0;
37
9c1d81c1
AM
38/* Maximum size of a group of input sections that can be handled by
39 one stub section. A value of +/-1 indicates the bfd back-end
40 should use a suitable default size. */
41static bfd_signed_vma group_size = 1;
42
fac1652d
AM
43/* Whether to add ".foo" entries for each "foo" in a version script. */
44static int dotsyms = 1;
45
e5096e3f 46/* Whether to run tls optimization. */
c5614fa4
AM
47static int no_tls_opt = 0;
48
49/* Whether to run opd optimization. */
50static int no_opd_opt = 0;
51
52/* Whether to run toc optimization. */
53static int no_toc_opt = 0;
e5096e3f 54
4c52953f
AM
55/* Whether to allow multiple toc sections. */
56static int no_multi_toc = 0;
57
0b9a4d73
AM
58/* Whether to emit symbols for stubs. */
59static int emit_stub_syms = 0;
60
61static asection *toc_section = 0;
62
3f764659
JJ
63/* Whether to canonicalize .opd so that there are no overlapping
64 .opd entries. */
65static int non_overlapping_opd = 0;
9c1d81c1
AM
66
67/* This is called before the input files are opened. We create a new
68 fake input file to hold the stub sections. */
69
70static void
7d8a3a28 71ppc_create_output_section_statements (void)
9c1d81c1 72{
a015f5ec
AM
73 extern const bfd_target bfd_elf64_powerpc_vec;
74 extern const bfd_target bfd_elf64_powerpcle_vec;
75
76 if (link_info.hash->creator != &bfd_elf64_powerpc_vec
77 && link_info.hash->creator != &bfd_elf64_powerpcle_vec)
78 return;
79
b9cf773d
AM
80 link_info.wrap_char = '.';
81
9c1d81c1
AM
82 stub_file = lang_add_input_file ("linker stubs",
83 lang_input_file_is_fake_enum,
84 NULL);
85 stub_file->the_bfd = bfd_create ("linker stubs", output_bfd);
86 if (stub_file->the_bfd == NULL
87 || !bfd_set_arch_mach (stub_file->the_bfd,
88 bfd_get_arch (output_bfd),
89 bfd_get_mach (output_bfd)))
90 {
91 einfo ("%X%P: can not create BFD %E\n");
92 return;
93 }
94
d457dcf6 95 stub_file->the_bfd->flags |= BFD_LINKER_CREATED;
9c1d81c1 96 ldlang_add_file (stub_file);
68f8ff14 97 ppc64_elf_init_stub_bfd (stub_file->the_bfd, &link_info);
9c1d81c1
AM
98}
99
836c6af1 100static void
7d8a3a28 101ppc_before_allocation (void)
836c6af1 102{
a015f5ec 103 if (stub_file != NULL)
e0468e59 104 {
c5614fa4
AM
105 if (!no_opd_opt
106 && !ppc64_elf_edit_opd (output_bfd, &link_info, non_overlapping_opd))
e5096e3f 107 {
c5614fa4 108 einfo ("%X%P: can not edit %s %E\n", "opd");
e5096e3f
AM
109 return;
110 }
111
c5614fa4 112 if (ppc64_elf_tls_setup (output_bfd, &link_info) && !no_tls_opt)
a015f5ec
AM
113 {
114 /* Size the sections. This is premature, but we want to know the
115 TLS segment layout so that certain optimizations can be done. */
116 lang_size_sections (stat_ptr->head, abs_output_section,
7d8a3a28 117 &stat_ptr->head, 0, 0, NULL, TRUE);
a015f5ec
AM
118
119 if (!ppc64_elf_tls_optimize (output_bfd, &link_info))
120 {
121 einfo ("%X%P: TLS problem %E\n");
122 return;
123 }
124
83490352
AM
125 /* We must not cache anything from the preliminary sizing. */
126 elf_tdata (output_bfd)->program_header_size = 0;
a015f5ec
AM
127 lang_reset_memory_regions ();
128 }
c5614fa4
AM
129
130 if (!no_toc_opt
131 && !link_info.relocatable
132 && !ppc64_elf_edit_toc (output_bfd, &link_info))
133 {
134 einfo ("%X%P: can not edit %s %E\n", "toc");
135 return;
136 }
e0468e59
AM
137 }
138
836c6af1
AM
139 gld${EMULATION_NAME}_before_allocation ();
140}
141
9c1d81c1
AM
142struct hook_stub_info
143{
144 lang_statement_list_type add;
145 asection *input_section;
146};
147
148/* Traverse the linker tree to find the spot where the stub goes. */
149
b34976b6 150static bfd_boolean
7d8a3a28 151hook_in_stub (struct hook_stub_info *info, lang_statement_union_type **lp)
9c1d81c1
AM
152{
153 lang_statement_union_type *l;
b34976b6 154 bfd_boolean ret;
9c1d81c1
AM
155
156 for (; (l = *lp) != NULL; lp = &l->header.next)
157 {
158 switch (l->header.type)
159 {
160 case lang_constructors_statement_enum:
161 ret = hook_in_stub (info, &constructor_list.head);
162 if (ret)
163 return ret;
164 break;
165
166 case lang_output_section_statement_enum:
167 ret = hook_in_stub (info,
168 &l->output_section_statement.children.head);
169 if (ret)
170 return ret;
171 break;
172
173 case lang_wild_statement_enum:
174 ret = hook_in_stub (info, &l->wild_statement.children.head);
175 if (ret)
176 return ret;
177 break;
178
179 case lang_group_statement_enum:
180 ret = hook_in_stub (info, &l->group_statement.children.head);
181 if (ret)
182 return ret;
183 break;
184
185 case lang_input_section_enum:
186 if (l->input_section.section == info->input_section)
187 {
188 /* We've found our section. Insert the stub immediately
189 before its associated input section. */
190 *lp = info->add.head;
191 *(info->add.tail) = l;
b34976b6 192 return TRUE;
9c1d81c1
AM
193 }
194 break;
195
196 case lang_data_statement_enum:
197 case lang_reloc_statement_enum:
198 case lang_object_symbols_statement_enum:
199 case lang_output_statement_enum:
200 case lang_target_statement_enum:
201 case lang_input_statement_enum:
202 case lang_assignment_statement_enum:
203 case lang_padding_statement_enum:
204 case lang_address_statement_enum:
205 case lang_fill_statement_enum:
206 break;
207
208 default:
209 FAIL ();
210 break;
211 }
212 }
b34976b6 213 return FALSE;
9c1d81c1
AM
214}
215
216
217/* Call-back for ppc64_elf_size_stubs. */
218
219/* Create a new stub section, and arrange for it to be linked
220 immediately before INPUT_SECTION. */
221
222static asection *
7d8a3a28 223ppc_add_stub_section (const char *stub_sec_name, asection *input_section)
9c1d81c1
AM
224{
225 asection *stub_sec;
226 flagword flags;
227 asection *output_section;
228 const char *secname;
229 lang_output_section_statement_type *os;
230 struct hook_stub_info info;
231
232 stub_sec = bfd_make_section_anyway (stub_file->the_bfd, stub_sec_name);
233 if (stub_sec == NULL)
234 goto err_ret;
235
236 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE
237 | SEC_HAS_CONTENTS | SEC_RELOC | SEC_IN_MEMORY | SEC_KEEP);
238 if (!bfd_set_section_flags (stub_file->the_bfd, stub_sec, flags))
239 goto err_ret;
240
241 output_section = input_section->output_section;
242 secname = bfd_get_section_name (output_section->owner, output_section);
243 os = lang_output_section_find (secname);
244
245 info.input_section = input_section;
246 lang_list_init (&info.add);
247 lang_add_section (&info.add, stub_sec, os, stub_file);
248
249 if (info.add.head == NULL)
250 goto err_ret;
251
68f8ff14 252 stub_added = 1;
9c1d81c1
AM
253 if (hook_in_stub (&info, &os->children.head))
254 return stub_sec;
255
256 err_ret:
257 einfo ("%X%P: can not make stub section: %E\n");
258 return NULL;
259}
260
261
262/* Another call-back for ppc64_elf_size_stubs. */
263
264static void
7d8a3a28 265ppc_layout_sections_again (void)
9c1d81c1
AM
266{
267 /* If we have changed sizes of the stub sections, then we need
268 to recalculate all the section offsets. This may mean we need to
269 add even more stubs. */
270 need_laying_out = 0;
271
272 lang_reset_memory_regions ();
273
274 /* Resize the sections. */
275 lang_size_sections (stat_ptr->head, abs_output_section,
7d8a3a28 276 &stat_ptr->head, 0, 0, NULL, TRUE);
9c1d81c1
AM
277
278 /* Recalculate TOC base. */
279 ldemul_after_allocation ();
280
281 /* Do the assignments again. */
7d8a3a28 282 lang_do_assignments (stat_ptr->head, abs_output_section, NULL, 0);
9c1d81c1
AM
283}
284
1f808cd5
AM
285
286/* Call the back-end function to set TOC base after we have placed all
287 the sections. */
288static void
7d8a3a28 289gld${EMULATION_NAME}_after_allocation (void)
1f808cd5 290{
1049f94e 291 if (!link_info.relocatable)
805fc799 292 _bfd_set_gp_value (output_bfd, ppc64_elf_toc (output_bfd));
1f808cd5
AM
293}
294
9c1d81c1 295
0b9a4d73 296static void
7d8a3a28 297build_toc_list (lang_statement_union_type *statement)
0b9a4d73
AM
298{
299 if (statement->header.type == lang_input_section_enum
300 && !statement->input_section.ifile->just_syms_flag
57ceae94 301 && (statement->input_section.section->flags & SEC_EXCLUDE) == 0
0b9a4d73 302 && statement->input_section.section->output_section == toc_section)
7d8a3a28 303 ppc64_elf_next_toc_section (&link_info, statement->input_section.section);
0b9a4d73
AM
304}
305
306
9c1d81c1 307static void
7d8a3a28 308build_section_lists (lang_statement_union_type *statement)
9c1d81c1
AM
309{
310 if (statement->header.type == lang_input_section_enum
805fc799 311 && !statement->input_section.ifile->just_syms_flag
57ceae94 312 && (statement->input_section.section->flags & SEC_EXCLUDE) == 0
805fc799
AM
313 && statement->input_section.section->output_section != NULL
314 && statement->input_section.section->output_section->owner == output_bfd)
9c1d81c1 315 {
6bc8652b
AM
316 if (!ppc64_elf_next_input_section (&link_info,
317 statement->input_section.section))
318 einfo ("%X%P: can not size stub section: %E\n");
9c1d81c1
AM
319 }
320}
321
fac1652d 322
9c1d81c1 323/* Final emulation specific call. */
1f808cd5
AM
324
325static void
7d8a3a28 326gld${EMULATION_NAME}_finish (void)
1f808cd5 327{
1e281515
AM
328 /* e_entry on PowerPC64 points to the function descriptor for
329 _start. If _start is missing, default to the first function
330 descriptor in the .opd section. */
331 entry_section = ".opd";
332
7a945db6 333 /* bfd_elf_discard_info just plays with debugging sections,
1f808cd5
AM
334 ie. doesn't affect any code, so we can delay resizing the
335 sections. It's likely we'll resize everything in the process of
9c1d81c1 336 adding stubs. */
7a945db6 337 if (bfd_elf_discard_info (output_bfd, &link_info))
1f808cd5
AM
338 need_laying_out = 1;
339
836c6af1
AM
340 /* If generating a relocatable output file, then we don't have any
341 stubs. */
1049f94e 342 if (stub_file != NULL && !link_info.relocatable)
1f808cd5 343 {
4c52953f
AM
344 int ret = ppc64_elf_setup_section_lists (output_bfd, &link_info,
345 no_multi_toc);
836c6af1 346 if (ret != 0)
9c1d81c1 347 {
836c6af1
AM
348 if (ret < 0)
349 {
350 einfo ("%X%P: can not size stub section: %E\n");
351 return;
352 }
9c1d81c1 353
68f8ff14 354 toc_section = bfd_get_section_by_name (output_bfd, ".got");
0b9a4d73
AM
355 if (toc_section != NULL)
356 lang_for_each_statement (build_toc_list);
357
358 ppc64_elf_reinit_toc (output_bfd, &link_info);
359
836c6af1 360 lang_for_each_statement (build_section_lists);
9c1d81c1 361
836c6af1
AM
362 /* Call into the BFD backend to do the real work. */
363 if (!ppc64_elf_size_stubs (output_bfd,
836c6af1
AM
364 &link_info,
365 group_size,
366 &ppc_add_stub_section,
367 &ppc_layout_sections_again))
368 {
369 einfo ("%X%P: can not size stub section: %E\n");
370 return;
371 }
1f808cd5 372 }
9c1d81c1 373 }
1f808cd5 374
9c1d81c1
AM
375 if (need_laying_out)
376 ppc_layout_sections_again ();
1f808cd5 377
40e45c8b
AM
378 if (link_info.relocatable)
379 {
380 asection *toc = bfd_get_section_by_name (output_bfd, ".toc");
381 if (toc != NULL
382 && bfd_section_size (output_bfd, toc) > 0x10000)
383 einfo ("%X%P: TOC section size exceeds 64k\n");
384 }
385
68f8ff14 386 if (stub_added)
9c1d81c1 387 {
bda6c678
AM
388 char *msg = NULL;
389 char *line, *endline;
390
a23d8409 391 emit_stub_syms |= link_info.emitrelocations;
bda6c678
AM
392 if (!ppc64_elf_build_stubs (emit_stub_syms, &link_info,
393 config.stats ? &msg : NULL))
9c1d81c1 394 einfo ("%X%P: can not build stubs: %E\n");
bda6c678
AM
395
396 for (line = msg; line != NULL; line = endline)
397 {
398 endline = strchr (line, '\n');
399 if (endline != NULL)
400 *endline++ = '\0';
401 fprintf (stderr, "%s: %s\n", program_name, line);
402 }
403 if (msg != NULL)
404 free (msg);
9c1d81c1 405 }
99877b66
AM
406
407 ppc64_elf_restore_symbols (&link_info);
9c1d81c1 408}
1f808cd5 409
76dc39fe 410
fac1652d
AM
411/* Add a pattern matching ".foo" for every "foo" in a version script.
412
413 The reason for doing this is that many shared library version
414 scripts export a selected set of functions or data symbols, forcing
415 others local. eg.
416
417 . VERS_1 {
418 . global:
419 . this; that; some; thing;
420 . local:
421 . *;
422 . };
423
424 To make the above work for PowerPC64, we need to export ".this",
425 ".that" and so on, otherwise only the function descriptor syms are
426 exported. Lack of an exported function code sym may cause a
427 definition to be pulled in from a static library. */
428
7d8a3a28
AM
429static struct bfd_elf_version_expr *
430gld${EMULATION_NAME}_new_vers_pattern (struct bfd_elf_version_expr *entry)
fac1652d
AM
431{
432 struct bfd_elf_version_expr *dot_entry;
fac1652d
AM
433 unsigned int len;
434 char *dot_pat;
435
108ba305 436 if (!dotsyms || entry->pattern[0] == '*' || entry->pattern[0] == '.')
fac1652d
AM
437 return entry;
438
7d8a3a28 439 dot_entry = xmalloc (sizeof *dot_entry);
108ba305 440 *dot_entry = *entry;
fac1652d
AM
441 dot_entry->next = entry;
442 len = strlen (entry->pattern) + 2;
443 dot_pat = xmalloc (len);
444 dot_pat[0] = '.';
445 memcpy (dot_pat + 1, entry->pattern, len - 1);
446 dot_entry->pattern = dot_pat;
c4e33880
AM
447 if (entry->symbol != NULL)
448 {
449 len = strlen (entry->symbol) + 2;
450 dot_pat = xmalloc (len);
451 dot_pat[0] = '.';
452 memcpy (dot_pat + 1, entry->symbol, len - 1);
453 dot_entry->symbol = dot_pat;
454 }
fac1652d
AM
455 return dot_entry;
456}
457
458
9c1d81c1
AM
459/* Avoid processing the fake stub_file in vercheck, stat_needed and
460 check_needed routines. */
1f808cd5 461
7d8a3a28 462static void (*real_func) (lang_input_statement_type *);
1f808cd5 463
7d8a3a28 464static void ppc_for_each_input_file_wrapper (lang_input_statement_type *l)
9c1d81c1
AM
465{
466 if (l != stub_file)
467 (*real_func) (l);
1f808cd5 468}
9c1d81c1
AM
469
470static void
7d8a3a28 471ppc_lang_for_each_input_file (void (*func) (lang_input_statement_type *))
9c1d81c1
AM
472{
473 real_func = func;
474 lang_for_each_input_file (&ppc_for_each_input_file_wrapper);
475}
476
477#define lang_for_each_input_file ppc_lang_for_each_input_file
478
1f808cd5
AM
479EOF
480
9c1d81c1
AM
481# Define some shell vars to insert bits of code into the standard elf
482# parse_args and list_options functions.
483#
484PARSE_AND_LIST_PROLOGUE='
485#define OPTION_STUBGROUP_SIZE 301
0b9a4d73
AM
486#define OPTION_STUBSYMS (OPTION_STUBGROUP_SIZE + 1)
487#define OPTION_DOTSYMS (OPTION_STUBSYMS + 1)
fac1652d 488#define OPTION_NO_DOTSYMS (OPTION_DOTSYMS + 1)
e5096e3f 489#define OPTION_NO_TLS_OPT (OPTION_NO_DOTSYMS + 1)
c5614fa4
AM
490#define OPTION_NO_OPD_OPT (OPTION_NO_TLS_OPT + 1)
491#define OPTION_NO_TOC_OPT (OPTION_NO_OPD_OPT + 1)
4c52953f
AM
492#define OPTION_NO_MULTI_TOC (OPTION_NO_TOC_OPT + 1)
493#define OPTION_NON_OVERLAPPING_OPD (OPTION_NO_MULTI_TOC + 1)
9c1d81c1
AM
494'
495
9c1d81c1
AM
496PARSE_AND_LIST_LONGOPTS='
497 { "stub-group-size", required_argument, NULL, OPTION_STUBGROUP_SIZE },
0b9a4d73 498 { "emit-stub-syms", no_argument, NULL, OPTION_STUBSYMS },
fac1652d
AM
499 { "dotsyms", no_argument, NULL, OPTION_DOTSYMS },
500 { "no-dotsyms", no_argument, NULL, OPTION_NO_DOTSYMS },
e5096e3f 501 { "no-tls-optimize", no_argument, NULL, OPTION_NO_TLS_OPT },
c5614fa4
AM
502 { "no-opd-optimize", no_argument, NULL, OPTION_NO_OPD_OPT },
503 { "no-toc-optimize", no_argument, NULL, OPTION_NO_TOC_OPT },
4c52953f 504 { "no-multi-toc", no_argument, NULL, OPTION_NO_MULTI_TOC },
3f764659 505 { "non-overlapping-opd", no_argument, NULL, OPTION_NON_OVERLAPPING_OPD },
9c1d81c1
AM
506'
507
508PARSE_AND_LIST_OPTIONS='
509 fprintf (file, _("\
510 --stub-group-size=N Maximum size of a group of input sections that can be\n\
511 handled by one stub section. A negative value\n\
512 locates all stubs before their branches (with a\n\
513 group size of -N), while a positive value allows\n\
514 two groups of input sections, one before, and one\n\
515 after each stub section. Values of +/-1 indicate\n\
516 the linker should choose suitable defaults.\n"
517 ));
fac1652d 518 fprintf (file, _("\
0b9a4d73
AM
519 --emit-stub-syms Label linker stubs with a symbol.\n"
520 ));
521 fprintf (file, _("\
fac1652d
AM
522 --dotsyms For every version pattern \"foo\" in a version script,\n\
523 add \".foo\" so that function code symbols are\n\
524 treated the same as function descriptor symbols.\n\
525 Defaults to on.\n"
526 ));
527 fprintf (file, _("\
528 --no-dotsyms Don'\''t do anything special in version scripts.\n"
529 ));
e5096e3f
AM
530 fprintf (file, _("\
531 --no-tls-optimize Don'\''t try to optimize TLS accesses.\n"
532 ));
3f764659 533 fprintf (file, _("\
c5614fa4
AM
534 --no-opd-optimize Don'\''t optimize the OPD section.\n"
535 ));
536 fprintf (file, _("\
537 --no-toc-optimize Don'\''t optimize the TOC section.\n"
538 ));
539 fprintf (file, _("\
4c52953f
AM
540 --no-multi-toc Disallow automatic multiple toc sections.\n"
541 ));
542 fprintf (file, _("\
3f764659
JJ
543 --non-overlapping-opd Canonicalize .opd, so that there are no overlapping\n\
544 .opd entries.\n"
545 ));
9c1d81c1
AM
546'
547
548PARSE_AND_LIST_ARGS_CASES='
549 case OPTION_STUBGROUP_SIZE:
550 {
551 const char *end;
552 group_size = bfd_scan_vma (optarg, &end, 0);
553 if (*end)
554 einfo (_("%P%F: invalid number `%s'\''\n"), optarg);
555 }
556 break;
fac1652d 557
0b9a4d73
AM
558 case OPTION_STUBSYMS:
559 emit_stub_syms = 1;
560 break;
561
fac1652d 562 case OPTION_DOTSYMS:
e5096e3f 563 dotsyms = 1;
fac1652d
AM
564 break;
565
566 case OPTION_NO_DOTSYMS:
e5096e3f
AM
567 dotsyms = 0;
568 break;
569
570 case OPTION_NO_TLS_OPT:
c5614fa4
AM
571 no_tls_opt = 1;
572 break;
573
574 case OPTION_NO_OPD_OPT:
575 no_opd_opt = 1;
576 break;
577
578 case OPTION_NO_TOC_OPT:
579 no_toc_opt = 1;
fac1652d 580 break;
3f764659 581
4c52953f
AM
582 case OPTION_NO_MULTI_TOC:
583 no_multi_toc = 1;
584 break;
585
3f764659
JJ
586 case OPTION_NON_OVERLAPPING_OPD:
587 non_overlapping_opd = 1;
588 break;
9c1d81c1
AM
589'
590
1f808cd5
AM
591# Put these extra ppc64elf routines in ld_${EMULATION_NAME}_emulation
592#
836c6af1 593LDEMUL_BEFORE_ALLOCATION=ppc_before_allocation
1f808cd5
AM
594LDEMUL_AFTER_ALLOCATION=gld${EMULATION_NAME}_after_allocation
595LDEMUL_FINISH=gld${EMULATION_NAME}_finish
9c1d81c1 596LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS=ppc_create_output_section_statements
fac1652d 597LDEMUL_NEW_VERS_PATTERN=gld${EMULATION_NAME}_new_vers_pattern
This page took 0.271383 seconds and 4 git commands to generate.