Consolidate ppc64 ld/bfd communication
[external/binutils.git] / ld / emultempl / ppc64elf.em
1 # This shell script emits a C file. -*- C -*-
2 # Copyright 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
3 # Free Software Foundation, Inc.
4 #
5 # This file is part of the GNU Binutils.
6 #
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.
11 #
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.
16 #
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.
21 #
22
23 # This file is sourced from elf32.em, and defines extra powerpc64-elf
24 # specific routines.
25 #
26 fragment <<EOF
27
28 #include "ldctor.h"
29 #include "libbfd.h"
30 #include "elf-bfd.h"
31 #include "elf64-ppc.h"
32 #include "ldlex.h"
33
34 static asection *ppc_add_stub_section (const char *, asection *);
35 static void ppc_layout_sections_again (void);
36
37 static struct ppc64_elf_params params = { NULL,
38                                           &ppc_add_stub_section,
39                                           &ppc_layout_sections_again,
40                                           1, 0, 0,
41                                           ${DEFAULT_PLT_STATIC_CHAIN-0}, -1, 0,
42                                           0, -1};
43
44 /* Fake input file for stubs.  */
45 static lang_input_statement_type *stub_file;
46 static int stub_added = 0;
47
48 /* Whether we need to call ppc_layout_sections_again.  */
49 static int need_laying_out = 0;
50
51 /* Whether to add ".foo" entries for each "foo" in a version script.  */
52 static int dotsyms = 1;
53
54 /* Whether to run tls optimization.  */
55 static int no_tls_opt = 0;
56
57 /* Whether to run opd optimization.  */
58 static int no_opd_opt = 0;
59
60 /* Whether to run toc optimization.  */
61 static int no_toc_opt = 0;
62
63 /* Whether to sort input toc and got sections.  */
64 static int no_toc_sort = 0;
65
66 /* Set if individual PLT call stubs should be aligned.  */
67 static int plt_stub_align = 0;
68
69 static asection *toc_section = 0;
70
71 /* This is called before the input files are opened.  We create a new
72    fake input file to hold the stub sections.  */
73
74 static void
75 ppc_create_output_section_statements (void)
76 {
77   if (!(bfd_get_flavour (link_info.output_bfd) == bfd_target_elf_flavour
78         && elf_object_id (link_info.output_bfd) == PPC64_ELF_DATA))
79     return;
80
81   link_info.wrap_char = '.';
82
83   stub_file = lang_add_input_file ("linker stubs",
84                                    lang_input_file_is_fake_enum,
85                                    NULL);
86   stub_file->the_bfd = bfd_create ("linker stubs", link_info.output_bfd);
87   if (stub_file->the_bfd == NULL
88       || !bfd_set_arch_mach (stub_file->the_bfd,
89                              bfd_get_arch (link_info.output_bfd),
90                              bfd_get_mach (link_info.output_bfd)))
91     {
92       einfo ("%F%P: can not create BFD: %E\n");
93       return;
94     }
95
96   stub_file->the_bfd->flags |= BFD_LINKER_CREATED;
97   ldlang_add_file (stub_file);
98   params.stub_bfd = stub_file->the_bfd;
99   if (!ppc64_elf_init_stub_bfd (&link_info, &params))
100     einfo ("%F%P: can not init BFD: %E\n");
101 }
102
103 /* Move the input section statement at *U which happens to be on LIST
104    to be just before *TO.  */
105
106 static void
107 move_input_section (lang_statement_list_type *list,
108                     lang_statement_union_type **u,
109                     lang_statement_union_type **to)
110 {
111   lang_statement_union_type *s = *u;
112   asection *i = s->input_section.section;
113   asection *p, *n;
114
115   /* Snip the input section from the statement list.  If it was the
116      last statement, fix the list tail pointer.  */
117   *u = s->header.next;
118   if (*u == NULL)
119     list->tail = u;
120   /* Add it back in the new position.  */
121   s->header.next = *to;
122   *to = s;
123   if (list->tail == to)
124     list->tail = &s->header.next;
125
126   /* Trim I off the bfd map_head/map_tail doubly linked lists.  */
127   n = i->map_head.s;
128   p = i->map_tail.s;
129   (p != NULL ? p : i->output_section)->map_head.s = n;
130   (n != NULL ? n : i->output_section)->map_tail.s = p;
131
132   /* Add I back on in its new position.  */
133   if (s->header.next->header.type == lang_input_section_enum)
134     {
135       n = s->header.next->input_section.section;
136       p = n->map_tail.s;
137     }
138   else
139     {
140       /* If the next statement is not an input section statement then
141          TO must point at the previous input section statement
142          header.next field.  */
143       lang_input_section_type *prev = (lang_input_section_type *)
144         ((char *) to - offsetof (lang_statement_union_type, header.next));
145
146       ASSERT (prev->header.type == lang_input_section_enum);
147       p = prev->section;
148       n = p->map_head.s;
149     }
150   i->map_head.s = n;
151   i->map_tail.s = p;
152   (p != NULL ? p : i->output_section)->map_head.s = i;
153   (n != NULL ? n : i->output_section)->map_tail.s = i;
154 }
155
156 /* Sort input section statements in the linker script tree rooted at
157    LIST so that those whose owning bfd happens to have a section
158    called .init or .fini are placed first.  Place any TOC sections
159    referenced by small TOC relocs next, with TOC sections referenced
160    only by bigtoc relocs last.  */
161
162 static void
163 sort_toc_sections (lang_statement_list_type *list,
164                    lang_statement_union_type **ini,
165                    lang_statement_union_type **small)
166 {
167   lang_statement_union_type *s, **u;
168   asection *i;
169
170   u = &list->head;
171   while ((s = *u) != NULL)
172     {
173       switch (s->header.type)
174         {
175         case lang_wild_statement_enum:
176           sort_toc_sections (&s->wild_statement.children, ini, small);
177           break;
178
179         case lang_group_statement_enum:
180           sort_toc_sections (&s->group_statement.children, ini, small);
181           break;
182
183         case lang_input_section_enum:
184           i = s->input_section.section;
185           /* Leave the stub_file .got where it is.  We put the .got
186              header there.  */
187           if (i->owner == stub_file->the_bfd)
188             break;
189           if (bfd_get_section_by_name (i->owner, ".init") != NULL
190               || bfd_get_section_by_name (i->owner, ".fini") != NULL)
191             {
192               if (ini != NULL && *ini != s)
193                 {
194                   move_input_section (list, u, ini);
195                   if (small == ini)
196                     small = &s->header.next;
197                   ini = &s->header.next;
198                   continue;
199                 }
200               if (small == ini)
201                 small = &s->header.next;
202               ini = &s->header.next;
203               break;
204             }
205           else if (ini == NULL)
206             ini = u;
207
208           if (ppc64_elf_has_small_toc_reloc (i))
209             {
210               if (small != NULL && *small != s)
211                 {
212                   move_input_section (list, u, small);
213                   small = &s->header.next;
214                   continue;
215                 }
216               small = &s->header.next;
217             }
218           else if (small == NULL)
219             small = u;
220           break;
221
222         default:
223           break;
224         }
225       u = &s->header.next;
226     }
227 }
228
229 static void
230 prelim_size_sections (void)
231 {
232   if (expld.phase != lang_mark_phase_enum)
233     {
234       expld.phase = lang_mark_phase_enum;
235       expld.dataseg.phase = exp_dataseg_none;
236       one_lang_size_sections_pass (NULL, FALSE);
237       /* We must not cache anything from the preliminary sizing.  */
238       lang_reset_memory_regions ();
239     }
240 }
241
242 static void
243 ppc_before_allocation (void)
244 {
245   if (stub_file != NULL)
246     {
247       if (!no_opd_opt
248           && !ppc64_elf_edit_opd (&link_info))
249         einfo ("%X%P: can not edit %s: %E\n", "opd");
250
251       if (ppc64_elf_tls_setup (&link_info)
252           && !no_tls_opt)
253         {
254           /* Size the sections.  This is premature, but we want to know the
255              TLS segment layout so that certain optimizations can be done.  */
256           prelim_size_sections ();
257
258           if (!ppc64_elf_tls_optimize (&link_info))
259             einfo ("%X%P: TLS problem %E\n");
260         }
261
262       if (!no_toc_opt
263           && !link_info.relocatable)
264         {
265           prelim_size_sections ();
266
267           if (!ppc64_elf_edit_toc (&link_info))
268             einfo ("%X%P: can not edit %s: %E\n", "toc");
269         }
270
271       if (!no_toc_sort)
272         {
273           lang_output_section_statement_type *toc_os;
274
275           toc_os = lang_output_section_find (".got");
276           if (toc_os != NULL)
277             sort_toc_sections (&toc_os->children, NULL, NULL);
278         }
279     }
280
281   gld${EMULATION_NAME}_before_allocation ();
282 }
283
284 struct hook_stub_info
285 {
286   lang_statement_list_type add;
287   asection *input_section;
288 };
289
290 /* Traverse the linker tree to find the spot where the stub goes.  */
291
292 static bfd_boolean
293 hook_in_stub (struct hook_stub_info *info, lang_statement_union_type **lp)
294 {
295   lang_statement_union_type *l;
296   bfd_boolean ret;
297
298   for (; (l = *lp) != NULL; lp = &l->header.next)
299     {
300       switch (l->header.type)
301         {
302         case lang_constructors_statement_enum:
303           ret = hook_in_stub (info, &constructor_list.head);
304           if (ret)
305             return ret;
306           break;
307
308         case lang_output_section_statement_enum:
309           ret = hook_in_stub (info,
310                               &l->output_section_statement.children.head);
311           if (ret)
312             return ret;
313           break;
314
315         case lang_wild_statement_enum:
316           ret = hook_in_stub (info, &l->wild_statement.children.head);
317           if (ret)
318             return ret;
319           break;
320
321         case lang_group_statement_enum:
322           ret = hook_in_stub (info, &l->group_statement.children.head);
323           if (ret)
324             return ret;
325           break;
326
327         case lang_input_section_enum:
328           if (l->input_section.section == info->input_section)
329             {
330               /* We've found our section.  Insert the stub immediately
331                  before its associated input section.  */
332               *lp = info->add.head;
333               *(info->add.tail) = l;
334               return TRUE;
335             }
336           break;
337
338         case lang_data_statement_enum:
339         case lang_reloc_statement_enum:
340         case lang_object_symbols_statement_enum:
341         case lang_output_statement_enum:
342         case lang_target_statement_enum:
343         case lang_input_statement_enum:
344         case lang_assignment_statement_enum:
345         case lang_padding_statement_enum:
346         case lang_address_statement_enum:
347         case lang_fill_statement_enum:
348           break;
349
350         default:
351           FAIL ();
352           break;
353         }
354     }
355   return FALSE;
356 }
357
358
359 /* Call-back for ppc64_elf_size_stubs.  */
360
361 /* Create a new stub section, and arrange for it to be linked
362    immediately before INPUT_SECTION.  */
363
364 static asection *
365 ppc_add_stub_section (const char *stub_sec_name, asection *input_section)
366 {
367   asection *stub_sec;
368   flagword flags;
369   asection *output_section;
370   lang_output_section_statement_type *os;
371   struct hook_stub_info info;
372
373   flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE
374            | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_KEEP);
375   stub_sec = bfd_make_section_anyway_with_flags (stub_file->the_bfd,
376                                                  stub_sec_name, flags);
377   if (stub_sec == NULL
378       || !bfd_set_section_alignment (stub_file->the_bfd, stub_sec,
379                                      plt_stub_align > 5 ? plt_stub_align : 5))
380     goto err_ret;
381
382   output_section = input_section->output_section;
383   os = lang_output_section_get (output_section);
384
385   info.input_section = input_section;
386   lang_list_init (&info.add);
387   lang_add_section (&info.add, stub_sec, NULL, os);
388
389   if (info.add.head == NULL)
390     goto err_ret;
391
392   stub_added = 1;
393   if (hook_in_stub (&info, &os->children.head))
394     return stub_sec;
395
396  err_ret:
397   einfo ("%X%P: can not make stub section: %E\n");
398   return NULL;
399 }
400
401
402 /* Another call-back for ppc64_elf_size_stubs.  */
403
404 static void
405 ppc_layout_sections_again (void)
406 {
407   /* If we have changed sizes of the stub sections, then we need
408      to recalculate all the section offsets.  This may mean we need to
409      add even more stubs.  */
410   gld${EMULATION_NAME}_map_segments (TRUE);
411
412   if (!link_info.relocatable)
413     ppc64_elf_set_toc (&link_info, link_info.output_bfd);
414
415   need_laying_out = -1;
416 }
417
418
419 static void
420 build_toc_list (lang_statement_union_type *statement)
421 {
422   if (statement->header.type == lang_input_section_enum)
423     {
424       asection *i = statement->input_section.section;
425
426       if (i->sec_info_type != SEC_INFO_TYPE_JUST_SYMS
427           && (i->flags & SEC_EXCLUDE) == 0
428           && i->output_section == toc_section)
429         {
430           if (!ppc64_elf_next_toc_section (&link_info, i))
431             einfo ("%X%P: linker script separates .got and .toc\n");
432         }
433     }
434 }
435
436
437 static void
438 build_section_lists (lang_statement_union_type *statement)
439 {
440   if (statement->header.type == lang_input_section_enum)
441     {
442       asection *i = statement->input_section.section;
443
444       if (!((lang_input_statement_type *) i->owner->usrdata)->flags.just_syms
445           && (i->flags & SEC_EXCLUDE) == 0
446           && i->output_section != NULL
447           && i->output_section->owner == link_info.output_bfd)
448         {
449           if (!ppc64_elf_next_input_section (&link_info, i))
450             einfo ("%X%P: can not size stub section: %E\n");
451         }
452     }
453 }
454
455
456 /* Call the back-end function to set TOC base after we have placed all
457    the sections.  */
458 static void
459 gld${EMULATION_NAME}_after_allocation (void)
460 {
461   /* bfd_elf_discard_info just plays with data and debugging sections,
462      ie. doesn't affect code size, so we can delay resizing the
463      sections.  It's likely we'll resize everything in the process of
464      adding stubs.  */
465   if (bfd_elf_discard_info (link_info.output_bfd, &link_info))
466     need_laying_out = 1;
467
468   /* If generating a relocatable output file, then we don't have any
469      stubs.  */
470   if (stub_file != NULL && !link_info.relocatable)
471     {
472       int ret = ppc64_elf_setup_section_lists (&link_info);
473       if (ret < 0)
474         einfo ("%X%P: can not size stub section: %E\n");
475       else if (ret > 0)
476         {
477           ppc64_elf_start_multitoc_partition (&link_info);
478
479           if (!params.no_multi_toc)
480             {
481               toc_section = bfd_get_section_by_name (link_info.output_bfd,
482                                                      ".got");
483               if (toc_section != NULL)
484                 lang_for_each_statement (build_toc_list);
485             }
486
487           if (ppc64_elf_layout_multitoc (&link_info)
488               && !params.no_multi_toc
489               && toc_section != NULL)
490             lang_for_each_statement (build_toc_list);
491
492           ppc64_elf_finish_multitoc_partition (&link_info);
493
494           lang_for_each_statement (build_section_lists);
495
496           if (!ppc64_elf_check_init_fini (&link_info))
497             einfo ("%P: .init/.fini fragments use differing TOC pointers\n");
498
499           /* Call into the BFD backend to do the real work.  */
500           if (!ppc64_elf_size_stubs (&link_info))
501             einfo ("%X%P: can not size stub section: %E\n");
502         }
503     }
504
505   if (need_laying_out != -1)
506     {
507       gld${EMULATION_NAME}_map_segments (need_laying_out);
508
509       if (!link_info.relocatable)
510         ppc64_elf_set_toc (&link_info, link_info.output_bfd);
511     }
512 }
513
514
515 /* Final emulation specific call.  */
516
517 static void
518 gld${EMULATION_NAME}_finish (void)
519 {
520   /* e_entry on PowerPC64 points to the function descriptor for
521      _start.  If _start is missing, default to the first function
522      descriptor in the .opd section.  */
523   entry_section = ".opd";
524
525   if (stub_added)
526     {
527       char *msg = NULL;
528       char *line, *endline;
529
530       if (params.emit_stub_syms < 0)
531         params.emit_stub_syms = 1;
532       if (!ppc64_elf_build_stubs (&link_info, config.stats ? &msg : NULL))
533         einfo ("%X%P: can not build stubs: %E\n");
534
535       fflush (stdout);
536       for (line = msg; line != NULL; line = endline)
537         {
538           endline = strchr (line, '\n');
539           if (endline != NULL)
540             *endline++ = '\0';
541           fprintf (stderr, "%s: %s\n", program_name, line);
542         }
543       fflush (stderr);
544       if (msg != NULL)
545         free (msg);
546     }
547
548   ppc64_elf_restore_symbols (&link_info);
549   finish_default ();
550 }
551
552
553 /* Add a pattern matching ".foo" for every "foo" in a version script.
554
555    The reason for doing this is that many shared library version
556    scripts export a selected set of functions or data symbols, forcing
557    others local.  eg.
558
559    . VERS_1 {
560    .       global:
561    .               this; that; some; thing;
562    .       local:
563    .               *;
564    .   };
565
566    To make the above work for PowerPC64, we need to export ".this",
567    ".that" and so on, otherwise only the function descriptor syms are
568    exported.  Lack of an exported function code sym may cause a
569    definition to be pulled in from a static library.  */
570
571 static struct bfd_elf_version_expr *
572 gld${EMULATION_NAME}_new_vers_pattern (struct bfd_elf_version_expr *entry)
573 {
574   struct bfd_elf_version_expr *dot_entry;
575   unsigned int len;
576   char *dot_pat;
577
578   if (!dotsyms
579       || entry->pattern[0] == '.'
580       || (!entry->literal && entry->pattern[0] == '*'))
581     return entry;
582
583   dot_entry = xmalloc (sizeof *dot_entry);
584   *dot_entry = *entry;
585   dot_entry->next = entry;
586   len = strlen (entry->pattern) + 2;
587   dot_pat = xmalloc (len);
588   dot_pat[0] = '.';
589   memcpy (dot_pat + 1, entry->pattern, len - 1);
590   dot_entry->pattern = dot_pat;
591   dot_entry->script = 1;
592   return dot_entry;
593 }
594
595
596 /* Avoid processing the fake stub_file in vercheck, stat_needed and
597    check_needed routines.  */
598
599 static void (*real_func) (lang_input_statement_type *);
600
601 static void ppc_for_each_input_file_wrapper (lang_input_statement_type *l)
602 {
603   if (l != stub_file)
604     (*real_func) (l);
605 }
606
607 static void
608 ppc_lang_for_each_input_file (void (*func) (lang_input_statement_type *))
609 {
610   real_func = func;
611   lang_for_each_input_file (&ppc_for_each_input_file_wrapper);
612 }
613
614 #define lang_for_each_input_file ppc_lang_for_each_input_file
615
616 EOF
617
618 if grep -q 'ld_elf32_spu_emulation' ldemul-list.h; then
619   fragment <<EOF
620 /* Special handling for embedded SPU executables.  */
621 extern bfd_boolean embedded_spu_file (lang_input_statement_type *, const char *);
622 static bfd_boolean gld${EMULATION_NAME}_load_symbols (lang_input_statement_type *);
623
624 static bfd_boolean
625 ppc64_recognized_file (lang_input_statement_type *entry)
626 {
627   if (embedded_spu_file (entry, "-m64"))
628     return TRUE;
629
630   return gld${EMULATION_NAME}_load_symbols (entry);
631 }
632 EOF
633 LDEMUL_RECOGNIZED_FILE=ppc64_recognized_file
634 fi
635
636 # Define some shell vars to insert bits of code into the standard elf
637 # parse_args and list_options functions.
638 #
639 PARSE_AND_LIST_PROLOGUE=${PARSE_AND_LIST_PROLOGUE}'
640 #define OPTION_STUBGROUP_SIZE           321
641 #define OPTION_PLT_STATIC_CHAIN         (OPTION_STUBGROUP_SIZE + 1)
642 #define OPTION_NO_PLT_STATIC_CHAIN      (OPTION_PLT_STATIC_CHAIN + 1)
643 #define OPTION_PLT_THREAD_SAFE          (OPTION_NO_PLT_STATIC_CHAIN + 1)
644 #define OPTION_NO_PLT_THREAD_SAFE       (OPTION_PLT_THREAD_SAFE + 1)
645 #define OPTION_PLT_ALIGN                (OPTION_NO_PLT_THREAD_SAFE + 1)
646 #define OPTION_NO_PLT_ALIGN             (OPTION_PLT_ALIGN + 1)
647 #define OPTION_STUBSYMS                 (OPTION_NO_PLT_ALIGN + 1)
648 #define OPTION_NO_STUBSYMS              (OPTION_STUBSYMS + 1)
649 #define OPTION_DOTSYMS                  (OPTION_NO_STUBSYMS + 1)
650 #define OPTION_NO_DOTSYMS               (OPTION_DOTSYMS + 1)
651 #define OPTION_NO_TLS_OPT               (OPTION_NO_DOTSYMS + 1)
652 #define OPTION_NO_TLS_GET_ADDR_OPT      (OPTION_NO_TLS_OPT + 1)
653 #define OPTION_NO_OPD_OPT               (OPTION_NO_TLS_GET_ADDR_OPT + 1)
654 #define OPTION_NO_TOC_OPT               (OPTION_NO_OPD_OPT + 1)
655 #define OPTION_NO_MULTI_TOC             (OPTION_NO_TOC_OPT + 1)
656 #define OPTION_NO_TOC_SORT              (OPTION_NO_MULTI_TOC + 1)
657 #define OPTION_NON_OVERLAPPING_OPD      (OPTION_NO_TOC_SORT + 1)
658 '
659
660 PARSE_AND_LIST_LONGOPTS=${PARSE_AND_LIST_LONGOPTS}'
661   { "stub-group-size", required_argument, NULL, OPTION_STUBGROUP_SIZE },
662   { "plt-static-chain", no_argument, NULL, OPTION_PLT_STATIC_CHAIN },
663   { "no-plt-static-chain", no_argument, NULL, OPTION_NO_PLT_STATIC_CHAIN },
664   { "plt-thread-safe", no_argument, NULL, OPTION_PLT_THREAD_SAFE },
665   { "no-plt-thread-safe", no_argument, NULL, OPTION_NO_PLT_THREAD_SAFE },
666   { "plt-align", optional_argument, NULL, OPTION_PLT_ALIGN },
667   { "no-plt-align", no_argument, NULL, OPTION_NO_PLT_ALIGN },
668   { "emit-stub-syms", no_argument, NULL, OPTION_STUBSYMS },
669   { "no-emit-stub-syms", no_argument, NULL, OPTION_NO_STUBSYMS },
670   { "dotsyms", no_argument, NULL, OPTION_DOTSYMS },
671   { "no-dotsyms", no_argument, NULL, OPTION_NO_DOTSYMS },
672   { "no-tls-optimize", no_argument, NULL, OPTION_NO_TLS_OPT },
673   { "no-tls-get-addr-optimize", no_argument, NULL, OPTION_NO_TLS_GET_ADDR_OPT },
674   { "no-opd-optimize", no_argument, NULL, OPTION_NO_OPD_OPT },
675   { "no-toc-optimize", no_argument, NULL, OPTION_NO_TOC_OPT },
676   { "no-multi-toc", no_argument, NULL, OPTION_NO_MULTI_TOC },
677   { "no-toc-sort", no_argument, NULL, OPTION_NO_TOC_SORT },
678   { "non-overlapping-opd", no_argument, NULL, OPTION_NON_OVERLAPPING_OPD },
679 '
680
681 PARSE_AND_LIST_OPTIONS=${PARSE_AND_LIST_OPTIONS}'
682   fprintf (file, _("\
683   --stub-group-size=N         Maximum size of a group of input sections that\n\
684                                 can be handled by one stub section.  A negative\n\
685                                 value locates all stubs before their branches\n\
686                                 (with a group size of -N), while a positive\n\
687                                 value allows two groups of input sections, one\n\
688                                 before, and one after each stub section.\n\
689                                 Values of +/-1 indicate the linker should\n\
690                                 choose suitable defaults.\n"
691                    ));
692   fprintf (file, _("\
693   --plt-static-chain          PLT call stubs should load r11.${DEFAULT_PLT_STATIC_CHAIN- (default)}\n"
694                    ));
695   fprintf (file, _("\
696   --no-plt-static-chain       PLT call stubs should not load r11.${DEFAULT_PLT_STATIC_CHAIN+ (default)}\n"
697                    ));
698   fprintf (file, _("\
699   --plt-thread-safe           PLT call stubs with load-load barrier.\n"
700                    ));
701   fprintf (file, _("\
702   --no-plt-thread-safe        PLT call stubs without barrier.\n"
703                    ));
704   fprintf (file, _("\
705   --plt-align [=<align>]      Align PLT call stubs to fit cache lines.\n"
706                    ));
707   fprintf (file, _("\
708   --no-plt-align              Dont'\''t align individual PLT call stubs.\n"
709                    ));
710   fprintf (file, _("\
711   --emit-stub-syms            Label linker stubs with a symbol.\n"
712                    ));
713   fprintf (file, _("\
714   --no-emit-stub-syms         Don'\''t label linker stubs with a symbol.\n"
715                    ));
716   fprintf (file, _("\
717   --dotsyms                   For every version pattern \"foo\" in a version\n\
718                                 script, add \".foo\" so that function code\n\
719                                 symbols are treated the same as function\n\
720                                 descriptor symbols.  Defaults to on.\n"
721                    ));
722   fprintf (file, _("\
723   --no-dotsyms                Don'\''t do anything special in version scripts.\n"
724                    ));
725   fprintf (file, _("\
726   --no-tls-optimize           Don'\''t try to optimize TLS accesses.\n"
727                    ));
728   fprintf (file, _("\
729   --no-tls-get-addr-optimize  Don'\''t use a special __tls_get_addr call.\n"
730                    ));
731   fprintf (file, _("\
732   --no-opd-optimize           Don'\''t optimize the OPD section.\n"
733                    ));
734   fprintf (file, _("\
735   --no-toc-optimize           Don'\''t optimize the TOC section.\n"
736                    ));
737   fprintf (file, _("\
738   --no-multi-toc              Disallow automatic multiple toc sections.\n"
739                    ));
740   fprintf (file, _("\
741   --no-toc-sort               Don'\''t sort TOC and GOT sections.\n"
742                    ));
743   fprintf (file, _("\
744   --non-overlapping-opd       Canonicalize .opd, so that there are no\n\
745                                 overlapping .opd entries.\n"
746                    ));
747 '
748
749 PARSE_AND_LIST_ARGS_CASES=${PARSE_AND_LIST_ARGS_CASES}'
750     case OPTION_STUBGROUP_SIZE:
751       {
752         const char *end;
753         params.group_size = bfd_scan_vma (optarg, &end, 0);
754         if (*end)
755           einfo (_("%P%F: invalid number `%s'\''\n"), optarg);
756       }
757       break;
758
759     case OPTION_PLT_STATIC_CHAIN:
760       params.plt_static_chain = 1;
761       break;
762
763     case OPTION_NO_PLT_STATIC_CHAIN:
764       params.plt_static_chain = 0;
765       break;
766
767     case OPTION_PLT_THREAD_SAFE:
768       params.plt_thread_safe = 1;
769       break;
770
771     case OPTION_NO_PLT_THREAD_SAFE:
772       params.plt_thread_safe = 0;
773       break;
774
775     case OPTION_PLT_ALIGN:
776       if (optarg != NULL)
777         {
778           char *end;
779           unsigned long val = strtoul (optarg, &end, 0);
780           if (*end || val > 8)
781             einfo (_("%P%F: invalid --plt-align `%s'\''\n"), optarg);
782           plt_stub_align = val;
783         }
784       else
785         plt_stub_align = 5;
786       break;
787
788     case OPTION_NO_PLT_ALIGN:
789       plt_stub_align = 0;
790       break;
791
792     case OPTION_STUBSYMS:
793       params.emit_stub_syms = 1;
794       break;
795
796     case OPTION_NO_STUBSYMS:
797       params.emit_stub_syms = 0;
798       break;
799
800     case OPTION_DOTSYMS:
801       dotsyms = 1;
802       break;
803
804     case OPTION_NO_DOTSYMS:
805       dotsyms = 0;
806       break;
807
808     case OPTION_NO_TLS_OPT:
809       no_tls_opt = 1;
810       break;
811
812     case OPTION_NO_TLS_GET_ADDR_OPT:
813       params.no_tls_get_addr_opt = 1;
814       break;
815
816     case OPTION_NO_OPD_OPT:
817       no_opd_opt = 1;
818       break;
819
820     case OPTION_NO_TOC_OPT:
821       no_toc_opt = 1;
822       break;
823
824     case OPTION_NO_MULTI_TOC:
825       params.no_multi_toc = 1;
826       break;
827
828     case OPTION_NO_TOC_SORT:
829       no_toc_sort = 1;
830       break;
831
832     case OPTION_NON_OVERLAPPING_OPD:
833       params.non_overlapping_opd = 1;
834       break;
835
836     case OPTION_TRADITIONAL_FORMAT:
837       no_tls_opt = 1;
838       params.no_tls_get_addr_opt = 1;
839       no_opd_opt = 1;
840       no_toc_opt = 1;
841       params.no_multi_toc = 1;
842       no_toc_sort = 1;
843       params.plt_static_chain = 1;
844       return FALSE;
845 '
846
847 # Put these extra ppc64elf routines in ld_${EMULATION_NAME}_emulation
848 #
849 LDEMUL_BEFORE_ALLOCATION=ppc_before_allocation
850 LDEMUL_AFTER_ALLOCATION=gld${EMULATION_NAME}_after_allocation
851 LDEMUL_FINISH=gld${EMULATION_NAME}_finish
852 LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS=ppc_create_output_section_statements
853 LDEMUL_NEW_VERS_PATTERN=gld${EMULATION_NAME}_new_vers_pattern