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