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