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