Blackfin disassmbler: fix typo where M2.H was decoded as L2.H
[binutils.git] / ld / emultempl / ppc64elf.em
blobf8604a67151bebaac4a878dcd76fd3f4672e6ee9
1 # This shell script emits a C file. -*- C -*-
2 # Copyright 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
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;
50 static int no_tls_get_addr_opt = 0;
52 /* Whether to run opd optimization.  */
53 static int no_opd_opt = 0;
55 /* Whether to run toc optimization.  */
56 static int no_toc_opt = 0;
58 /* Whether to allow multiple toc sections.  */
59 static int no_multi_toc = 0;
61 /* Whether to sort input toc and got sections.  */
62 static int no_toc_sort = 0;
64 /* Whether to emit symbols for stubs.  */
65 static int emit_stub_syms = -1;
67 static asection *toc_section = 0;
69 /* Whether to canonicalize .opd so that there are no overlapping
70    .opd entries.  */
71 static int non_overlapping_opd = 0;
73 /* This is called before the input files are opened.  We create a new
74    fake input file to hold the stub sections.  */
76 static void
77 ppc_create_output_section_statements (void)
79   if (!(bfd_get_flavour (link_info.output_bfd) == bfd_target_elf_flavour
80         && elf_object_id (link_info.output_bfd) == PPC64_ELF_DATA))
81     return;
83   link_info.wrap_char = '.';
85   stub_file = lang_add_input_file ("linker stubs",
86                                    lang_input_file_is_fake_enum,
87                                    NULL);
88   stub_file->the_bfd = bfd_create ("linker stubs", link_info.output_bfd);
89   if (stub_file->the_bfd == NULL
90       || !bfd_set_arch_mach (stub_file->the_bfd,
91                              bfd_get_arch (link_info.output_bfd),
92                              bfd_get_mach (link_info.output_bfd)))
93     {
94       einfo ("%F%P: can not create BFD %E\n");
95       return;
96     }
98   stub_file->the_bfd->flags |= BFD_LINKER_CREATED;
99   ldlang_add_file (stub_file);
100   ppc64_elf_init_stub_bfd (stub_file->the_bfd, &link_info);
103 /* Move the input section statement at *U which happens to be on LIST
104    to be just before *TO.  */
106 static void
107 move_input_section (lang_statement_list_type *list,
108                     lang_statement_union_type **u,
109                     lang_statement_union_type **to)
111   lang_statement_union_type *s = *u;
112   asection *i = s->input_section.section;
113   asection *p, *n;
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;
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;
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));
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;
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.  */
162 static void
163 sort_toc_sections (lang_statement_list_type *list,
164                    lang_statement_union_type **ini,
165                    lang_statement_union_type **small)
167   lang_statement_union_type *s, **u;
168   asection *i;
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;
179         case lang_group_statement_enum:
180           sort_toc_sections (&s->group_statement.children, ini, small);
181           break;
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;
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;
222         default:
223           break;
224         }
225       u = &s->header.next;
226     }
229 static void
230 ppc_before_allocation (void)
232   if (stub_file != NULL)
233     {
234       if (!no_opd_opt
235           && !ppc64_elf_edit_opd (&link_info, non_overlapping_opd))
236         einfo ("%X%P: can not edit %s %E\n", "opd");
238       if (ppc64_elf_tls_setup (&link_info, no_tls_get_addr_opt, &no_multi_toc)
239           && !no_tls_opt)
240         {
241           /* Size the sections.  This is premature, but we want to know the
242              TLS segment layout so that certain optimizations can be done.  */
243           expld.phase = lang_mark_phase_enum;
244           expld.dataseg.phase = exp_dataseg_none;
245           one_lang_size_sections_pass (NULL, TRUE);
247           if (!ppc64_elf_tls_optimize (&link_info))
248             einfo ("%X%P: TLS problem %E\n");
250           /* We must not cache anything from the preliminary sizing.  */
251           lang_reset_memory_regions ();
252         }
254       if (!no_toc_opt
255           && !link_info.relocatable
256           && !ppc64_elf_edit_toc (&link_info))
257         einfo ("%X%P: can not edit %s %E\n", "toc");
259       if (!no_toc_sort)
260         {
261           lang_output_section_statement_type *toc_os;
263           toc_os = lang_output_section_find (".got");
264           if (toc_os != NULL)
265             sort_toc_sections (&toc_os->children, NULL, NULL);
266         }
267     }
269   gld${EMULATION_NAME}_before_allocation ();
272 struct hook_stub_info
274   lang_statement_list_type add;
275   asection *input_section;
278 /* Traverse the linker tree to find the spot where the stub goes.  */
280 static bfd_boolean
281 hook_in_stub (struct hook_stub_info *info, lang_statement_union_type **lp)
283   lang_statement_union_type *l;
284   bfd_boolean ret;
286   for (; (l = *lp) != NULL; lp = &l->header.next)
287     {
288       switch (l->header.type)
289         {
290         case lang_constructors_statement_enum:
291           ret = hook_in_stub (info, &constructor_list.head);
292           if (ret)
293             return ret;
294           break;
296         case lang_output_section_statement_enum:
297           ret = hook_in_stub (info,
298                               &l->output_section_statement.children.head);
299           if (ret)
300             return ret;
301           break;
303         case lang_wild_statement_enum:
304           ret = hook_in_stub (info, &l->wild_statement.children.head);
305           if (ret)
306             return ret;
307           break;
309         case lang_group_statement_enum:
310           ret = hook_in_stub (info, &l->group_statement.children.head);
311           if (ret)
312             return ret;
313           break;
315         case lang_input_section_enum:
316           if (l->input_section.section == info->input_section)
317             {
318               /* We've found our section.  Insert the stub immediately
319                  before its associated input section.  */
320               *lp = info->add.head;
321               *(info->add.tail) = l;
322               return TRUE;
323             }
324           break;
326         case lang_data_statement_enum:
327         case lang_reloc_statement_enum:
328         case lang_object_symbols_statement_enum:
329         case lang_output_statement_enum:
330         case lang_target_statement_enum:
331         case lang_input_statement_enum:
332         case lang_assignment_statement_enum:
333         case lang_padding_statement_enum:
334         case lang_address_statement_enum:
335         case lang_fill_statement_enum:
336           break;
338         default:
339           FAIL ();
340           break;
341         }
342     }
343   return FALSE;
347 /* Call-back for ppc64_elf_size_stubs.  */
349 /* Create a new stub section, and arrange for it to be linked
350    immediately before INPUT_SECTION.  */
352 static asection *
353 ppc_add_stub_section (const char *stub_sec_name, asection *input_section)
355   asection *stub_sec;
356   flagword flags;
357   asection *output_section;
358   const char *secname;
359   lang_output_section_statement_type *os;
360   struct hook_stub_info info;
362   flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE
363            | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_KEEP);
364   stub_sec = bfd_make_section_anyway_with_flags (stub_file->the_bfd,
365                                                  stub_sec_name, flags);
366   if (stub_sec == NULL)
367     goto err_ret;
369   output_section = input_section->output_section;
370   secname = bfd_get_section_name (output_section->owner, output_section);
371   os = lang_output_section_find (secname);
373   info.input_section = input_section;
374   lang_list_init (&info.add);
375   lang_add_section (&info.add, stub_sec, os);
377   if (info.add.head == NULL)
378     goto err_ret;
380   stub_added = 1;
381   if (hook_in_stub (&info, &os->children.head))
382     return stub_sec;
384  err_ret:
385   einfo ("%X%P: can not make stub section: %E\n");
386   return NULL;
390 /* Another call-back for ppc64_elf_size_stubs.  */
392 static void
393 ppc_layout_sections_again (void)
395   /* If we have changed sizes of the stub sections, then we need
396      to recalculate all the section offsets.  This may mean we need to
397      add even more stubs.  */
398   gld${EMULATION_NAME}_map_segments (TRUE);
400   if (!link_info.relocatable)
401     _bfd_set_gp_value (link_info.output_bfd,
402                        ppc64_elf_toc (link_info.output_bfd));
404   need_laying_out = -1;
408 static void
409 build_toc_list (lang_statement_union_type *statement)
411   if (statement->header.type == lang_input_section_enum)
412     {
413       asection *i = statement->input_section.section;
415       if (!((lang_input_statement_type *) i->owner->usrdata)->just_syms_flag
416           && (i->flags & SEC_EXCLUDE) == 0
417           && i->output_section == toc_section)
418         {
419           if (!ppc64_elf_next_toc_section (&link_info, i))
420             einfo ("%X%P: linker script separates .got and .toc\n");
421         }
422     }
426 static void
427 build_section_lists (lang_statement_union_type *statement)
429   if (statement->header.type == lang_input_section_enum)
430     {
431       asection *i = statement->input_section.section;
433       if (!((lang_input_statement_type *) i->owner->usrdata)->just_syms_flag
434           && (i->flags & SEC_EXCLUDE) == 0
435           && i->output_section != NULL
436           && i->output_section->owner == link_info.output_bfd)
437         {
438           if (!ppc64_elf_next_input_section (&link_info, i))
439             einfo ("%X%P: can not size stub section: %E\n");
440         }
441     }
445 /* Call the back-end function to set TOC base after we have placed all
446    the sections.  */
447 static void
448 gld${EMULATION_NAME}_after_allocation (void)
450   /* bfd_elf_discard_info just plays with data and debugging sections,
451      ie. doesn't affect code size, so we can delay resizing the
452      sections.  It's likely we'll resize everything in the process of
453      adding stubs.  */
454   if (bfd_elf_discard_info (link_info.output_bfd, &link_info))
455     need_laying_out = 1;
457   /* If generating a relocatable output file, then we don't have any
458      stubs.  */
459   if (stub_file != NULL && !link_info.relocatable)
460     {
461       int ret = ppc64_elf_setup_section_lists (&link_info,
462                                                &ppc_add_stub_section,
463                                                &ppc_layout_sections_again);
464       if (ret < 0)
465         einfo ("%X%P: can not size stub section: %E\n");
466       else if (ret > 0)
467         {
468           ppc64_elf_start_multitoc_partition (&link_info);
470           if (!no_multi_toc)
471             {
472               toc_section = bfd_get_section_by_name (link_info.output_bfd,
473                                                      ".got");
474               if (toc_section != NULL)
475                 lang_for_each_statement (build_toc_list);
476             }
478           if (ppc64_elf_layout_multitoc (&link_info)
479               && !no_multi_toc
480               && toc_section != NULL)
481             lang_for_each_statement (build_toc_list);
483           ppc64_elf_finish_multitoc_partition (&link_info);
485           lang_for_each_statement (build_section_lists);
487           if (!ppc64_elf_check_init_fini (&link_info))
488             einfo ("%P: .init/.fini fragments use differing TOC pointers\n");
490           /* Call into the BFD backend to do the real work.  */
491           if (!ppc64_elf_size_stubs (&link_info, group_size))
492             einfo ("%X%P: can not size stub section: %E\n");
493         }
494     }
496   if (need_laying_out != -1)
497     {
498       gld${EMULATION_NAME}_map_segments (need_laying_out);
500       if (!link_info.relocatable)
501         _bfd_set_gp_value (link_info.output_bfd,
502                            ppc64_elf_toc (link_info.output_bfd));
503     }
507 /* Final emulation specific call.  */
509 static void
510 gld${EMULATION_NAME}_finish (void)
512   /* e_entry on PowerPC64 points to the function descriptor for
513      _start.  If _start is missing, default to the first function
514      descriptor in the .opd section.  */
515   entry_section = ".opd";
517   if (link_info.relocatable)
518     {
519       asection *toc = bfd_get_section_by_name (link_info.output_bfd, ".toc");
520       if (toc != NULL
521           && bfd_section_size (link_info.output_bfd, toc) > 0x10000)
522         einfo ("%X%P: TOC section size exceeds 64k\n");
523     }
525   if (stub_added)
526     {
527       char *msg = NULL;
528       char *line, *endline;
530       if (emit_stub_syms < 0)
531         emit_stub_syms = 1;
532       if (!ppc64_elf_build_stubs (emit_stub_syms, &link_info,
533                                   config.stats ? &msg : NULL))
534         einfo ("%X%P: can not build stubs: %E\n");
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       if (msg != NULL)
544         free (msg);
545     }
547   ppc64_elf_restore_symbols (&link_info);
548   finish_default ();
552 /* Add a pattern matching ".foo" for every "foo" in a version script.
554    The reason for doing this is that many shared library version
555    scripts export a selected set of functions or data symbols, forcing
556    others local.  eg.
558    . VERS_1 {
559    .       global:
560    .               this; that; some; thing;
561    .       local:
562    .               *;
563    .   };
565    To make the above work for PowerPC64, we need to export ".this",
566    ".that" and so on, otherwise only the function descriptor syms are
567    exported.  Lack of an exported function code sym may cause a
568    definition to be pulled in from a static library.  */
570 static struct bfd_elf_version_expr *
571 gld${EMULATION_NAME}_new_vers_pattern (struct bfd_elf_version_expr *entry)
573   struct bfd_elf_version_expr *dot_entry;
574   unsigned int len;
575   char *dot_pat;
577   if (!dotsyms
578       || entry->pattern[0] == '.'
579       || (!entry->literal && entry->pattern[0] == '*'))
580     return entry;
582   dot_entry = xmalloc (sizeof *dot_entry);
583   *dot_entry = *entry;
584   dot_entry->next = entry;
585   len = strlen (entry->pattern) + 2;
586   dot_pat = xmalloc (len);
587   dot_pat[0] = '.';
588   memcpy (dot_pat + 1, entry->pattern, len - 1);
589   dot_entry->pattern = dot_pat;
590   return dot_entry;
594 /* Avoid processing the fake stub_file in vercheck, stat_needed and
595    check_needed routines.  */
597 static void (*real_func) (lang_input_statement_type *);
599 static void ppc_for_each_input_file_wrapper (lang_input_statement_type *l)
601   if (l != stub_file)
602     (*real_func) (l);
605 static void
606 ppc_lang_for_each_input_file (void (*func) (lang_input_statement_type *))
608   real_func = func;
609   lang_for_each_input_file (&ppc_for_each_input_file_wrapper);
612 #define lang_for_each_input_file ppc_lang_for_each_input_file
616 if grep -q 'ld_elf32_spu_emulation' ldemul-list.h; then
617   fragment <<EOF
618 /* Special handling for embedded SPU executables.  */
619 extern bfd_boolean embedded_spu_file (lang_input_statement_type *, const char *);
620 static bfd_boolean gld${EMULATION_NAME}_load_symbols (lang_input_statement_type *);
622 static bfd_boolean
623 ppc64_recognized_file (lang_input_statement_type *entry)
625   if (embedded_spu_file (entry, "-m64"))
626     return TRUE;
628   return gld${EMULATION_NAME}_load_symbols (entry);
631 LDEMUL_RECOGNIZED_FILE=ppc64_recognized_file
634 # Define some shell vars to insert bits of code into the standard elf
635 # parse_args and list_options functions.
637 PARSE_AND_LIST_PROLOGUE='
638 #define OPTION_STUBGROUP_SIZE           301
639 #define OPTION_STUBSYMS                 (OPTION_STUBGROUP_SIZE + 1)
640 #define OPTION_NO_STUBSYMS              (OPTION_STUBSYMS + 1)
641 #define OPTION_DOTSYMS                  (OPTION_NO_STUBSYMS + 1)
642 #define OPTION_NO_DOTSYMS               (OPTION_DOTSYMS + 1)
643 #define OPTION_NO_TLS_OPT               (OPTION_NO_DOTSYMS + 1)
644 #define OPTION_NO_TLS_GET_ADDR_OPT      (OPTION_NO_TLS_OPT + 1)
645 #define OPTION_NO_OPD_OPT               (OPTION_NO_TLS_GET_ADDR_OPT + 1)
646 #define OPTION_NO_TOC_OPT               (OPTION_NO_OPD_OPT + 1)
647 #define OPTION_NO_MULTI_TOC             (OPTION_NO_TOC_OPT + 1)
648 #define OPTION_NO_TOC_SORT              (OPTION_NO_MULTI_TOC + 1)
649 #define OPTION_NON_OVERLAPPING_OPD      (OPTION_NO_TOC_SORT + 1)
652 PARSE_AND_LIST_LONGOPTS='
653   { "stub-group-size", required_argument, NULL, OPTION_STUBGROUP_SIZE },
654   { "emit-stub-syms", no_argument, NULL, OPTION_STUBSYMS },
655   { "no-emit-stub-syms", no_argument, NULL, OPTION_NO_STUBSYMS },
656   { "dotsyms", no_argument, NULL, OPTION_DOTSYMS },
657   { "no-dotsyms", no_argument, NULL, OPTION_NO_DOTSYMS },
658   { "no-tls-optimize", no_argument, NULL, OPTION_NO_TLS_OPT },
659   { "no-tls-get-addr-optimize", no_argument, NULL, OPTION_NO_TLS_GET_ADDR_OPT },
660   { "no-opd-optimize", no_argument, NULL, OPTION_NO_OPD_OPT },
661   { "no-toc-optimize", no_argument, NULL, OPTION_NO_TOC_OPT },
662   { "no-multi-toc", no_argument, NULL, OPTION_NO_MULTI_TOC },
663   { "no-toc-sort", no_argument, NULL, OPTION_NO_TOC_SORT },
664   { "non-overlapping-opd", no_argument, NULL, OPTION_NON_OVERLAPPING_OPD },
667 PARSE_AND_LIST_OPTIONS='
668   fprintf (file, _("\
669   --stub-group-size=N         Maximum size of a group of input sections that\n\
670                                 can be handled by one stub section.  A negative\n\
671                                 value locates all stubs before their branches\n\
672                                 (with a group size of -N), while a positive\n\
673                                 value allows two groups of input sections, one\n\
674                                 before, and one after each stub section.\n\
675                                 Values of +/-1 indicate the linker should\n\
676                                 choose suitable defaults.\n"
677                    ));
678   fprintf (file, _("\
679   --emit-stub-syms            Label linker stubs with a symbol.\n"
680                    ));
681   fprintf (file, _("\
682   --no-emit-stub-syms         Don'\''t label linker stubs with a symbol.\n"
683                    ));
684   fprintf (file, _("\
685   --dotsyms                   For every version pattern \"foo\" in a version\n\
686                                 script, add \".foo\" so that function code\n\
687                                 symbols are treated the same as function\n\
688                                 descriptor symbols.  Defaults to on.\n"
689                    ));
690   fprintf (file, _("\
691   --no-dotsyms                Don'\''t do anything special in version scripts.\n"
692                    ));
693   fprintf (file, _("\
694   --no-tls-optimize           Don'\''t try to optimize TLS accesses.\n"
695                    ));
696   fprintf (file, _("\
697   --no-tls-get-addr-optimize  Don'\''t use a special __tls_get_addr call.\n"
698                    ));
699   fprintf (file, _("\
700   --no-opd-optimize           Don'\''t optimize the OPD section.\n"
701                    ));
702   fprintf (file, _("\
703   --no-toc-optimize           Don'\''t optimize the TOC section.\n"
704                    ));
705   fprintf (file, _("\
706   --no-multi-toc              Disallow automatic multiple toc sections.\n"
707                    ));
708   fprintf (file, _("\
709   --no-toc-sort               Don'\''t sort TOC and GOT sections.\n"
710                    ));
711   fprintf (file, _("\
712   --non-overlapping-opd       Canonicalize .opd, so that there are no\n\
713                                 overlapping .opd entries.\n"
714                    ));
717 PARSE_AND_LIST_ARGS_CASES='
718     case OPTION_STUBGROUP_SIZE:
719       {
720         const char *end;
721         group_size = bfd_scan_vma (optarg, &end, 0);
722         if (*end)
723           einfo (_("%P%F: invalid number `%s'\''\n"), optarg);
724       }
725       break;
727     case OPTION_STUBSYMS:
728       emit_stub_syms = 1;
729       break;
731     case OPTION_NO_STUBSYMS:
732       emit_stub_syms = 0;
733       break;
735     case OPTION_DOTSYMS:
736       dotsyms = 1;
737       break;
739     case OPTION_NO_DOTSYMS:
740       dotsyms = 0;
741       break;
743     case OPTION_NO_TLS_OPT:
744       no_tls_opt = 1;
745       break;
747     case OPTION_NO_TLS_GET_ADDR_OPT:
748       no_tls_get_addr_opt = 1;
749       break;
751     case OPTION_NO_OPD_OPT:
752       no_opd_opt = 1;
753       break;
755     case OPTION_NO_TOC_OPT:
756       no_toc_opt = 1;
757       break;
759     case OPTION_NO_MULTI_TOC:
760       no_multi_toc = 1;
761       break;
763     case OPTION_NO_TOC_SORT:
764       no_toc_sort = 1;
765       break;
767     case OPTION_NON_OVERLAPPING_OPD:
768       non_overlapping_opd = 1;
769       break;
772 # Put these extra ppc64elf routines in ld_${EMULATION_NAME}_emulation
774 LDEMUL_BEFORE_ALLOCATION=ppc_before_allocation
775 LDEMUL_AFTER_ALLOCATION=gld${EMULATION_NAME}_after_allocation
776 LDEMUL_FINISH=gld${EMULATION_NAME}_finish
777 LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS=ppc_create_output_section_statements
778 LDEMUL_NEW_VERS_PATTERN=gld${EMULATION_NAME}_new_vers_pattern