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