Fix formatting of most recent entry.
[binutils.git] / ld / emultempl / ppc64elf.em
blobb23ae4381ab2703647441579565126a3368fed08
1 # This shell script emits a C file. -*- C -*-
2 # Copyright 2002, 2003, 2004, 2005, 2007, 2008
3 # Free Software Foundation, Inc.
5 # This file is part of the GNU Binutils.
7 # This program is free software; you can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; either version 3 of the License, or
10 # (at your option) any later version.
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 # GNU General Public License for more details.
17 # You should have received a copy of the GNU General Public License
18 # along with this program; if not, write to the Free Software
19 # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20 # MA 02110-1301, USA.
23 # This file is sourced from elf32.em, and defines extra powerpc64-elf
24 # specific routines.
26 fragment <<EOF
28 #include "ldctor.h"
29 #include "libbfd.h"
30 #include "elf-bfd.h"
31 #include "elf64-ppc.h"
33 /* Fake input file for stubs.  */
34 static lang_input_statement_type *stub_file;
35 static int stub_added = 0;
37 /* Whether we need to call ppc_layout_sections_again.  */
38 static int need_laying_out = 0;
40 /* Maximum size of a group of input sections that can be handled by
41    one stub section.  A value of +/-1 indicates the bfd back-end
42    should use a suitable default size.  */
43 static bfd_signed_vma group_size = 1;
45 /* Whether to add ".foo" entries for each "foo" in a version script.  */
46 static int dotsyms = 1;
48 /* Whether to run tls optimization.  */
49 static int no_tls_opt = 0;
51 /* Whether to run opd optimization.  */
52 static int no_opd_opt = 0;
54 /* Whether to run toc optimization.  */
55 static int no_toc_opt = 0;
57 /* Whether to allow multiple toc sections.  */
58 static int no_multi_toc = 0;
60 /* Whether to emit symbols for stubs.  */
61 static int emit_stub_syms = 0;
63 static asection *toc_section = 0;
65 /* Whether to canonicalize .opd so that there are no overlapping
66    .opd entries.  */
67 static int non_overlapping_opd = 0;
69 /* This is called before the input files are opened.  We create a new
70    fake input file to hold the stub sections.  */
72 static void
73 ppc_create_output_section_statements (void)
75   extern const bfd_target bfd_elf64_powerpc_vec;
76   extern const bfd_target bfd_elf64_powerpcle_vec;
78   if (link_info.hash->creator != &bfd_elf64_powerpc_vec
79       && link_info.hash->creator != &bfd_elf64_powerpcle_vec)
80     return;
82   link_info.wrap_char = '.';
84   stub_file = lang_add_input_file ("linker stubs",
85                                    lang_input_file_is_fake_enum,
86                                    NULL);
87   stub_file->the_bfd = bfd_create ("linker stubs", output_bfd);
88   if (stub_file->the_bfd == NULL
89       || !bfd_set_arch_mach (stub_file->the_bfd,
90                              bfd_get_arch (output_bfd),
91                              bfd_get_mach (output_bfd)))
92     {
93       einfo ("%F%P: can not create BFD %E\n");
94       return;
95     }
97   stub_file->the_bfd->flags |= BFD_LINKER_CREATED;
98   ldlang_add_file (stub_file);
99   ppc64_elf_init_stub_bfd (stub_file->the_bfd, &link_info);
102 static void
103 ppc_before_allocation (void)
105   if (stub_file != NULL)
106     {
107       if (!no_opd_opt
108           && !ppc64_elf_edit_opd (output_bfd, &link_info, non_overlapping_opd))
109         einfo ("%X%P: can not edit %s %E\n", "opd");
111       if (ppc64_elf_tls_setup (output_bfd, &link_info) && !no_tls_opt)
112         {
113           /* Size the sections.  This is premature, but we want to know the
114              TLS segment layout so that certain optimizations can be done.  */
115           expld.phase = lang_mark_phase_enum;
116           expld.dataseg.phase = exp_dataseg_none;
117           one_lang_size_sections_pass (NULL, TRUE);
119           if (!ppc64_elf_tls_optimize (output_bfd, &link_info))
120             einfo ("%X%P: TLS problem %E\n");
122           /* We must not cache anything from the preliminary sizing.  */
123           lang_reset_memory_regions ();
124         }
126       if (!no_toc_opt
127           && !link_info.relocatable
128           && !ppc64_elf_edit_toc (output_bfd, &link_info))
129         einfo ("%X%P: can not edit %s %E\n", "toc");
130     }
132   gld${EMULATION_NAME}_before_allocation ();
135 struct hook_stub_info
137   lang_statement_list_type add;
138   asection *input_section;
141 /* Traverse the linker tree to find the spot where the stub goes.  */
143 static bfd_boolean
144 hook_in_stub (struct hook_stub_info *info, lang_statement_union_type **lp)
146   lang_statement_union_type *l;
147   bfd_boolean ret;
149   for (; (l = *lp) != NULL; lp = &l->header.next)
150     {
151       switch (l->header.type)
152         {
153         case lang_constructors_statement_enum:
154           ret = hook_in_stub (info, &constructor_list.head);
155           if (ret)
156             return ret;
157           break;
159         case lang_output_section_statement_enum:
160           ret = hook_in_stub (info,
161                               &l->output_section_statement.children.head);
162           if (ret)
163             return ret;
164           break;
166         case lang_wild_statement_enum:
167           ret = hook_in_stub (info, &l->wild_statement.children.head);
168           if (ret)
169             return ret;
170           break;
172         case lang_group_statement_enum:
173           ret = hook_in_stub (info, &l->group_statement.children.head);
174           if (ret)
175             return ret;
176           break;
178         case lang_input_section_enum:
179           if (l->input_section.section == info->input_section)
180             {
181               /* We've found our section.  Insert the stub immediately
182                  before its associated input section.  */
183               *lp = info->add.head;
184               *(info->add.tail) = l;
185               return TRUE;
186             }
187           break;
189         case lang_data_statement_enum:
190         case lang_reloc_statement_enum:
191         case lang_object_symbols_statement_enum:
192         case lang_output_statement_enum:
193         case lang_target_statement_enum:
194         case lang_input_statement_enum:
195         case lang_assignment_statement_enum:
196         case lang_padding_statement_enum:
197         case lang_address_statement_enum:
198         case lang_fill_statement_enum:
199           break;
201         default:
202           FAIL ();
203           break;
204         }
205     }
206   return FALSE;
210 /* Call-back for ppc64_elf_size_stubs.  */
212 /* Create a new stub section, and arrange for it to be linked
213    immediately before INPUT_SECTION.  */
215 static asection *
216 ppc_add_stub_section (const char *stub_sec_name, asection *input_section)
218   asection *stub_sec;
219   flagword flags;
220   asection *output_section;
221   const char *secname;
222   lang_output_section_statement_type *os;
223   struct hook_stub_info info;
225   stub_sec = bfd_make_section_anyway (stub_file->the_bfd, stub_sec_name);
226   if (stub_sec == NULL)
227     goto err_ret;
229   flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE
230            | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_KEEP);
231   if (!bfd_set_section_flags (stub_file->the_bfd, stub_sec, flags))
232     goto err_ret;
234   output_section = input_section->output_section;
235   secname = bfd_get_section_name (output_section->owner, output_section);
236   os = lang_output_section_find (secname);
238   info.input_section = input_section;
239   lang_list_init (&info.add);
240   lang_add_section (&info.add, stub_sec, os);
242   if (info.add.head == NULL)
243     goto err_ret;
245   stub_added = 1;
246   if (hook_in_stub (&info, &os->children.head))
247     return stub_sec;
249  err_ret:
250   einfo ("%X%P: can not make stub section: %E\n");
251   return NULL;
255 /* Another call-back for ppc64_elf_size_stubs.  */
257 static void
258 ppc_layout_sections_again (void)
260   /* If we have changed sizes of the stub sections, then we need
261      to recalculate all the section offsets.  This may mean we need to
262      add even more stubs.  */
263   gld${EMULATION_NAME}_map_segments (TRUE);
264   need_laying_out = -1;
268 /* Call the back-end function to set TOC base after we have placed all
269    the sections.  */
270 static void
271 gld${EMULATION_NAME}_after_allocation (void)
273   if (!link_info.relocatable)
274     _bfd_set_gp_value (output_bfd, ppc64_elf_toc (output_bfd));
278 static void
279 build_toc_list (lang_statement_union_type *statement)
281   if (statement->header.type == lang_input_section_enum)
282     {
283       asection *i = statement->input_section.section;
285       if (!((lang_input_statement_type *) i->owner->usrdata)->just_syms_flag
286           && (i->flags & SEC_EXCLUDE) == 0
287           && i->output_section == toc_section)
288         ppc64_elf_next_toc_section (&link_info, i);
289     }
293 static void
294 build_section_lists (lang_statement_union_type *statement)
296   if (statement->header.type == lang_input_section_enum)
297     {
298       asection *i = statement->input_section.section;
300       if (!((lang_input_statement_type *) i->owner->usrdata)->just_syms_flag
301           && (i->flags & SEC_EXCLUDE) == 0
302           && i->output_section != NULL
303           && i->output_section->owner == output_bfd)
304         {
305           if (!ppc64_elf_next_input_section (&link_info, i))
306             einfo ("%X%P: can not size stub section: %E\n");
307         }
308     }
312 /* Final emulation specific call.  */
314 static void
315 gld${EMULATION_NAME}_finish (void)
317   /* e_entry on PowerPC64 points to the function descriptor for
318      _start.  If _start is missing, default to the first function
319      descriptor in the .opd section.  */
320   entry_section = ".opd";
322   /* bfd_elf_discard_info just plays with debugging sections,
323      ie. doesn't affect any code, so we can delay resizing the
324      sections.  It's likely we'll resize everything in the process of
325      adding stubs.  */
326   if (bfd_elf_discard_info (output_bfd, &link_info))
327     need_laying_out = 1;
329   /* If generating a relocatable output file, then we don't have any
330      stubs.  */
331   if (stub_file != NULL && !link_info.relocatable)
332     {
333       int ret = ppc64_elf_setup_section_lists (output_bfd, &link_info,
334                                                no_multi_toc);
335       if (ret < 0)
336         einfo ("%X%P: can not size stub section: %E\n");
337       else if (ret > 0)
338         {
339           toc_section = bfd_get_section_by_name (output_bfd, ".got");
340           if (toc_section != NULL)
341             lang_for_each_statement (build_toc_list);
343           ppc64_elf_reinit_toc (output_bfd, &link_info);
345           lang_for_each_statement (build_section_lists);
347           /* Call into the BFD backend to do the real work.  */
348           if (!ppc64_elf_size_stubs (output_bfd,
349                                      &link_info,
350                                      group_size,
351                                      &ppc_add_stub_section,
352                                      &ppc_layout_sections_again))
353             einfo ("%X%P: can not size stub section: %E\n");
354         }
355     }
357   if (need_laying_out != -1)
358     gld${EMULATION_NAME}_map_segments (need_laying_out);
360   if (link_info.relocatable)
361     {
362       asection *toc = bfd_get_section_by_name (output_bfd, ".toc");
363       if (toc != NULL
364           && bfd_section_size (output_bfd, toc) > 0x10000)
365         einfo ("%X%P: TOC section size exceeds 64k\n");
366     }
368   if (stub_added)
369     {
370       char *msg = NULL;
371       char *line, *endline;
373       emit_stub_syms |= link_info.emitrelocations;
374       if (!ppc64_elf_build_stubs (emit_stub_syms, &link_info,
375                                   config.stats ? &msg : NULL))
376         einfo ("%X%P: can not build stubs: %E\n");
378       for (line = msg; line != NULL; line = endline)
379         {
380           endline = strchr (line, '\n');
381           if (endline != NULL)
382             *endline++ = '\0';
383           fprintf (stderr, "%s: %s\n", program_name, line);
384         }
385       if (msg != NULL)
386         free (msg);
387     }
389   ppc64_elf_restore_symbols (&link_info);
390   finish_default ();
394 /* Add a pattern matching ".foo" for every "foo" in a version script.
396    The reason for doing this is that many shared library version
397    scripts export a selected set of functions or data symbols, forcing
398    others local.  eg.
400    . VERS_1 {
401    .       global:
402    .               this; that; some; thing;
403    .       local:
404    .               *;
405    .   };
407    To make the above work for PowerPC64, we need to export ".this",
408    ".that" and so on, otherwise only the function descriptor syms are
409    exported.  Lack of an exported function code sym may cause a
410    definition to be pulled in from a static library.  */
412 static struct bfd_elf_version_expr *
413 gld${EMULATION_NAME}_new_vers_pattern (struct bfd_elf_version_expr *entry)
415   struct bfd_elf_version_expr *dot_entry;
416   unsigned int len;
417   char *dot_pat;
419   if (!dotsyms
420       || (entry->pattern != NULL
421           && (entry->pattern[0] == '*' || entry->pattern[0] == '.')))
422     return entry;
424   dot_entry = xmalloc (sizeof *dot_entry);
425   *dot_entry = *entry;
426   dot_entry->next = entry;
427   if (entry->pattern != NULL)
428     {
429       len = strlen (entry->pattern) + 2;
430       dot_pat = xmalloc (len);
431       dot_pat[0] = '.';
432       memcpy (dot_pat + 1, entry->pattern, len - 1);
433       dot_entry->pattern = dot_pat;
434     }
435   if (entry->symbol != NULL)
436     {
437       len = strlen (entry->symbol) + 2;
438       dot_pat = xmalloc (len);
439       dot_pat[0] = '.';
440       memcpy (dot_pat + 1, entry->symbol, len - 1);
441       dot_entry->symbol = dot_pat;
442     }
443   return dot_entry;
447 /* Avoid processing the fake stub_file in vercheck, stat_needed and
448    check_needed routines.  */
450 static void (*real_func) (lang_input_statement_type *);
452 static void ppc_for_each_input_file_wrapper (lang_input_statement_type *l)
454   if (l != stub_file)
455     (*real_func) (l);
458 static void
459 ppc_lang_for_each_input_file (void (*func) (lang_input_statement_type *))
461   real_func = func;
462   lang_for_each_input_file (&ppc_for_each_input_file_wrapper);
465 #define lang_for_each_input_file ppc_lang_for_each_input_file
469 if grep -q 'ld_elf32_spu_emulation' ldemul-list.h; then
470   fragment <<EOF
471 /* Special handling for embedded SPU executables.  */
472 extern bfd_boolean embedded_spu_file (lang_input_statement_type *, const char *);
473 static bfd_boolean gld${EMULATION_NAME}_load_symbols (lang_input_statement_type *);
475 static bfd_boolean
476 ppc64_recognized_file (lang_input_statement_type *entry)
478   if (embedded_spu_file (entry, "-m64"))
479     return TRUE;
481   return gld${EMULATION_NAME}_load_symbols (entry);
484 LDEMUL_RECOGNIZED_FILE=ppc64_recognized_file
487 # Define some shell vars to insert bits of code into the standard elf
488 # parse_args and list_options functions.
490 PARSE_AND_LIST_PROLOGUE='
491 #define OPTION_STUBGROUP_SIZE           301
492 #define OPTION_STUBSYMS                 (OPTION_STUBGROUP_SIZE + 1)
493 #define OPTION_DOTSYMS                  (OPTION_STUBSYMS + 1)
494 #define OPTION_NO_DOTSYMS               (OPTION_DOTSYMS + 1)
495 #define OPTION_NO_TLS_OPT               (OPTION_NO_DOTSYMS + 1)
496 #define OPTION_NO_OPD_OPT               (OPTION_NO_TLS_OPT + 1)
497 #define OPTION_NO_TOC_OPT               (OPTION_NO_OPD_OPT + 1)
498 #define OPTION_NO_MULTI_TOC             (OPTION_NO_TOC_OPT + 1)
499 #define OPTION_NON_OVERLAPPING_OPD      (OPTION_NO_MULTI_TOC + 1)
502 PARSE_AND_LIST_LONGOPTS='
503   { "stub-group-size", required_argument, NULL, OPTION_STUBGROUP_SIZE },
504   { "emit-stub-syms", no_argument, NULL, OPTION_STUBSYMS },
505   { "dotsyms", no_argument, NULL, OPTION_DOTSYMS },
506   { "no-dotsyms", no_argument, NULL, OPTION_NO_DOTSYMS },
507   { "no-tls-optimize", no_argument, NULL, OPTION_NO_TLS_OPT },
508   { "no-opd-optimize", no_argument, NULL, OPTION_NO_OPD_OPT },
509   { "no-toc-optimize", no_argument, NULL, OPTION_NO_TOC_OPT },
510   { "no-multi-toc", no_argument, NULL, OPTION_NO_MULTI_TOC },
511   { "non-overlapping-opd", no_argument, NULL, OPTION_NON_OVERLAPPING_OPD },
514 PARSE_AND_LIST_OPTIONS='
515   fprintf (file, _("\
516   --stub-group-size=N         Maximum size of a group of input sections that\n\
517                                 can be handled by one stub section.  A negative\n\
518                                 value locates all stubs before their branches\n\
519                                 (with a group size of -N), while a positive\n\
520                                 value allows two groups of input sections, one\n\
521                                 before, and one after each stub section.\n\
522                                 Values of +/-1 indicate the linker should\n\
523                                 choose suitable defaults.\n"
524                    ));
525   fprintf (file, _("\
526   --emit-stub-syms            Label linker stubs with a symbol.\n"
527                    ));
528   fprintf (file, _("\
529   --dotsyms                   For every version pattern \"foo\" in a version\n\
530                                 script, add \".foo\" so that function code\n\
531                                 symbols are treated the same as function\n\
532                                 descriptor symbols.  Defaults to on.\n"
533                    ));
534   fprintf (file, _("\
535   --no-dotsyms                Don'\''t do anything special in version scripts.\n"
536                    ));
537   fprintf (file, _("\
538   --no-tls-optimize           Don'\''t try to optimize TLS accesses.\n"
539                    ));
540   fprintf (file, _("\
541   --no-opd-optimize           Don'\''t optimize the OPD section.\n"
542                    ));
543   fprintf (file, _("\
544   --no-toc-optimize           Don'\''t optimize the TOC section.\n"
545                    ));
546   fprintf (file, _("\
547   --no-multi-toc              Disallow automatic multiple toc sections.\n"
548                    ));
549   fprintf (file, _("\
550   --non-overlapping-opd       Canonicalize .opd, so that there are no\n\
551                                 overlapping .opd entries.\n"
552                    ));
555 PARSE_AND_LIST_ARGS_CASES='
556     case OPTION_STUBGROUP_SIZE:
557       {
558         const char *end;
559         group_size = bfd_scan_vma (optarg, &end, 0);
560         if (*end)
561           einfo (_("%P%F: invalid number `%s'\''\n"), optarg);
562       }
563       break;
565     case OPTION_STUBSYMS:
566       emit_stub_syms = 1;
567       break;
569     case OPTION_DOTSYMS:
570       dotsyms = 1;
571       break;
573     case OPTION_NO_DOTSYMS:
574       dotsyms = 0;
575       break;
577     case OPTION_NO_TLS_OPT:
578       no_tls_opt = 1;
579       break;
581     case OPTION_NO_OPD_OPT:
582       no_opd_opt = 1;
583       break;
585     case OPTION_NO_TOC_OPT:
586       no_toc_opt = 1;
587       break;
589     case OPTION_NO_MULTI_TOC:
590       no_multi_toc = 1;
591       break;
593     case OPTION_NON_OVERLAPPING_OPD:
594       non_overlapping_opd = 1;
595       break;
598 # Put these extra ppc64elf routines in ld_${EMULATION_NAME}_emulation
600 LDEMUL_BEFORE_ALLOCATION=ppc_before_allocation
601 LDEMUL_AFTER_ALLOCATION=gld${EMULATION_NAME}_after_allocation
602 LDEMUL_FINISH=gld${EMULATION_NAME}_finish
603 LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS=ppc_create_output_section_statements
604 LDEMUL_NEW_VERS_PATTERN=gld${EMULATION_NAME}_new_vers_pattern