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