1 # This shell script emits a C file. -*- C -*-
2 # Copyright (C) 2003-2019 Free Software Foundation, Inc.
4 # This file is part of the GNU Binutils.
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.
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.
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,
22 # This file is sourced from elf32.em, and defines extra powerpc32-elf
27 #include "elf32-ppc.h"
31 #define is_ppc_elf(bfd) \
32 (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
33 && elf_object_id (bfd) == PPC32_ELF_DATA)
35 /* Whether to run tls optimization. */
36 static int notlsopt = 0;
38 /* Whether to convert inline PLT calls to direct. */
39 static int no_inline_opt = 0;
41 /* Choose the correct place for .got. */
42 static int old_got = 0;
44 static struct ppc_elf_params params = { PLT_UNSET, 0, -1,
45 0, 0, 0, 0, 0, 0, 0 };
48 ppc_after_open_output (void)
50 if (params.emit_stub_syms < 0)
51 params.emit_stub_syms = (link_info.emitrelocations
52 || bfd_link_pic (&link_info));
53 if (params.pagesize == 0)
54 params.pagesize = config.commonpagesize;
55 ppc_elf_link_params (&link_info, ¶ms);
60 # No --secure-plt, --bss-plt, or --sdata-got for vxworks.
61 if test -z "$VXWORKS_BASE_EM_FILE" ; then
64 ppc_after_check_relocs (void)
66 if (is_ppc_elf (link_info.output_bfd))
72 lang_output_section_statement_type *os;
73 lang_output_section_statement_type *plt_os[2];
74 lang_output_section_statement_type *got_os[2];
76 new_plt = ppc_elf_select_plt_layout (link_info.output_bfd, &link_info);
78 einfo (_("%X%P: select_plt_layout problem %E\n"));
82 for (os = &lang_os_list.head->output_section_statement;
86 if (os->constraint == SPECIAL && strcmp (os->name, ".plt") == 0)
92 if (os->constraint == SPECIAL && strcmp (os->name, ".got") == 0)
100 keep_new = new_plt == 1 ? 0 : -1;
103 plt_os[0]->constraint = keep_new;
104 plt_os[1]->constraint = ~keep_new;
110 got_os[0]->constraint = keep_new;
111 got_os[1]->constraint = ~keep_new;
115 after_check_relocs_default ();
122 prelim_size_sections (void)
124 if (expld.phase != lang_mark_phase_enum)
126 expld.phase = lang_mark_phase_enum;
127 expld.dataseg.phase = exp_seg_none;
128 one_lang_size_sections_pass (NULL, FALSE);
129 /* We must not cache anything from the preliminary sizing. */
130 lang_reset_memory_regions ();
135 ppc_before_allocation (void)
137 if (is_ppc_elf (link_info.output_bfd))
140 && !bfd_link_relocatable (&link_info))
142 prelim_size_sections ();
144 if (!ppc_elf_inline_plt (&link_info))
145 einfo (_("%X%P: inline PLT: %E\n"));
148 if (ppc_elf_tls_setup (link_info.output_bfd, &link_info)
151 if (!ppc_elf_tls_optimize (link_info.output_bfd, &link_info))
153 einfo (_("%X%P: TLS problem %E\n"));
159 gld${EMULATION_NAME}_before_allocation ();
161 ppc_elf_maybe_strip_sdata_syms (&link_info);
163 if (RELAXATION_ENABLED)
164 params.branch_trampolines = 1;
166 /* Turn on relaxation if executable sections have addresses that
167 might make branches overflow. */
168 else if (!RELAXATION_DISABLED_BY_USER)
170 bfd_vma low = (bfd_vma) -1;
174 /* Run lang_size_sections even if already done, so as to pick
175 up gld${EMULATION_NAME}_before_allocation sizing. This
176 matters when we have an executable bss plt which will
177 typically be laid out near the end of the image, ie. worst
178 case for branches at the start of .text. */
179 expld.phase = lang_first_phase_enum;
180 prelim_size_sections ();
182 for (o = link_info.output_bfd->sections; o != NULL; o = o->next)
184 if ((o->flags & (SEC_ALLOC | SEC_CODE)) != (SEC_ALLOC | SEC_CODE))
190 if (high < o->vma + o->rawsize - 1)
191 high = o->vma + o->rawsize - 1;
193 if (high > low && high - low > (1 << 25) - 1)
194 params.branch_trampolines = 1;
197 if (params.branch_trampolines
198 || params.ppc476_workaround
199 || params.pic_fixup > 0)
203 /* Replaces default zero fill padding in executable sections with
204 "ba 0" instructions. This works around the ppc476 icache bug if we
205 have a function pointer tail call near the end of a page, some
206 small amount of padding, then the function called at the beginning
207 of the next page. If the "ba 0" is ever executed we should hit a
208 segv, so it's almost as good as an illegal instruction (zero). */
211 no_zero_padding (lang_statement_union_type *l)
213 if (l->header.type == lang_padding_statement_enum
214 && l->padding_statement.size != 0
215 && l->padding_statement.output_section != NULL
216 && (l->padding_statement.output_section->flags & SEC_CODE) != 0
217 && l->padding_statement.fill->size == 0)
219 struct _ppc_fill_type
222 unsigned char data[4];
224 static struct _ppc_fill_type fill_be = { 4, {0x48, 0, 0, 2} };
225 static struct _ppc_fill_type fill_le = { 4, {2, 0, 0, 0x48} };
227 if (bfd_big_endian (link_info.output_bfd))
228 l->padding_statement.fill = (struct _fill_type *) &fill_be;
230 l->padding_statement.fill = (struct _fill_type *) &fill_le;
237 if (params.ppc476_workaround)
238 lang_for_each_statement (no_zero_padding);
239 if (!ppc_finish_symbols (&link_info))
240 einfo (_("%X%P: ppc_finish_symbols problem %E\n"));
246 if grep -q 'ld_elf32_spu_emulation' ldemul-list.h; then
248 /* Special handling for embedded SPU executables. */
249 extern bfd_boolean embedded_spu_file (lang_input_statement_type *, const char *);
250 static bfd_boolean gld${EMULATION_NAME}_load_symbols (lang_input_statement_type *);
253 ppc_recognized_file (lang_input_statement_type *entry)
255 if (embedded_spu_file (entry, "-m32"))
258 return gld${EMULATION_NAME}_load_symbols (entry);
262 LDEMUL_RECOGNIZED_FILE=ppc_recognized_file
265 # Define some shell vars to insert bits of code into the standard elf
266 # parse_args and list_options functions.
268 PARSE_AND_LIST_PROLOGUE=${PARSE_AND_LIST_PROLOGUE}'
271 OPTION_NO_TLS_OPT = 321,
272 OPTION_NO_TLS_GET_ADDR_OPT,
277 OPTION_NO_INLINE_OPT,
281 OPTION_PPC476_WORKAROUND,
282 OPTION_NO_PPC476_WORKAROUND,
284 OPTION_VLE_RELOC_FIXUP
288 PARSE_AND_LIST_LONGOPTS=${PARSE_AND_LIST_LONGOPTS}'
289 { "emit-stub-syms", no_argument, NULL, OPTION_STUBSYMS },
290 { "no-emit-stub-syms", no_argument, NULL, OPTION_NO_STUBSYMS },
291 { "no-tls-optimize", no_argument, NULL, OPTION_NO_TLS_OPT },
292 { "no-tls-get-addr-optimize", no_argument, NULL, OPTION_NO_TLS_GET_ADDR_OPT },'
293 if test -z "$VXWORKS_BASE_EM_FILE" ; then
294 PARSE_AND_LIST_LONGOPTS=${PARSE_AND_LIST_LONGOPTS}'
295 { "secure-plt", no_argument, NULL, OPTION_NEW_PLT },
296 { "bss-plt", no_argument, NULL, OPTION_OLD_PLT },
297 { "plt-align", optional_argument, NULL, OPTION_PLT_ALIGN },
298 { "no-plt-align", no_argument, NULL, OPTION_NO_PLT_ALIGN },
299 { "no-inline-optimize", no_argument, NULL, OPTION_NO_INLINE_OPT },
300 { "sdata-got", no_argument, NULL, OPTION_OLD_GOT },'
302 PARSE_AND_LIST_LONGOPTS=${PARSE_AND_LIST_LONGOPTS}'
303 { "ppc476-workaround", optional_argument, NULL, OPTION_PPC476_WORKAROUND },
304 { "no-ppc476-workaround", no_argument, NULL, OPTION_NO_PPC476_WORKAROUND },
305 { "no-pic-fixup", no_argument, NULL, OPTION_NO_PICFIXUP },
306 { "vle-reloc-fixup", no_argument, NULL, OPTION_VLE_RELOC_FIXUP },
309 PARSE_AND_LIST_OPTIONS=${PARSE_AND_LIST_OPTIONS}'
311 --emit-stub-syms Label linker stubs with a symbol\n"
314 --no-emit-stub-syms Don'\''t label linker stubs with a symbol\n"
317 --no-tls-optimize Don'\''t try to optimize TLS accesses\n"
320 --no-tls-get-addr-optimize Don'\''t use a special __tls_get_addr call\n"
322 if test -z "$VXWORKS_BASE_EM_FILE" ; then
323 PARSE_AND_LIST_OPTIONS=${PARSE_AND_LIST_OPTIONS}'\
325 --secure-plt Use new-style PLT if possible\n"
328 --bss-plt Force old-style BSS PLT\n"
331 --plt-align Align PLT call stubs to fit cache lines\n"
334 --no-plt-align Dont'\''t align individual PLT call stubs\n"
337 --no-inline-optimize Don'\''t convert inline PLT to direct calls\n"
340 --sdata-got Force GOT location just before .sdata\n"
343 PARSE_AND_LIST_OPTIONS=${PARSE_AND_LIST_OPTIONS}'\
345 --ppc476-workaround [=pagesize]\n\
346 Avoid a cache bug on ppc476\n"
349 --no-ppc476-workaround Disable workaround\n"
352 --no-pic-fixup Don'\''t edit non-pic to pic\n"
355 --vle-reloc-fixup Correct old object file 16A/16D relocation\n"
359 PARSE_AND_LIST_ARGS_CASES=${PARSE_AND_LIST_ARGS_CASES}'
360 case OPTION_STUBSYMS:
361 params.emit_stub_syms = 1;
364 case OPTION_NO_STUBSYMS:
365 params.emit_stub_syms = 0;
368 case OPTION_NO_TLS_OPT:
372 case OPTION_NO_TLS_GET_ADDR_OPT:
373 params.no_tls_get_addr_opt = 1;
377 params.plt_style = PLT_NEW;
381 params.plt_style = PLT_OLD;
384 case OPTION_PLT_ALIGN:
388 unsigned long val = strtoul (optarg, &end, 0);
390 einfo (_("%F%P: invalid --plt-align `%s'\''\n"), optarg);
391 params.plt_stub_align = val;
394 params.plt_stub_align = 5;
397 case OPTION_NO_PLT_ALIGN:
398 params.plt_stub_align = 0;
401 case OPTION_NO_INLINE_OPT:
409 case OPTION_TRADITIONAL_FORMAT:
411 params.no_tls_get_addr_opt = 1;
414 case OPTION_PPC476_WORKAROUND:
415 params.ppc476_workaround = 1;
419 params.pagesize = strtoul (optarg, &end, 0);
421 || (params.pagesize < 4096 && params.pagesize != 0)
422 || params.pagesize != (params.pagesize & -params.pagesize))
423 einfo (_("%F%P: invalid pagesize `%s'\''\n"), optarg);
427 case OPTION_NO_PPC476_WORKAROUND:
428 params.ppc476_workaround = 0;
431 case OPTION_NO_PICFIXUP:
432 params.pic_fixup = -1;
435 case OPTION_VLE_RELOC_FIXUP:
436 params.vle_reloc_fixup = 1;
440 # Put these extra ppc32elf routines in ld_${EMULATION_NAME}_emulation
442 LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS=ppc_after_open_output
443 if test -z "$VXWORKS_BASE_EM_FILE" ; then
444 LDEMUL_AFTER_CHECK_RELOCS=ppc_after_check_relocs
446 LDEMUL_BEFORE_ALLOCATION=ppc_before_allocation
447 LDEMUL_FINISH=ppc_finish