]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - ld/emultempl/ppc32elf.em
PowerPC gcc bootstrap fail with bss-plt
[thirdparty/binutils-gdb.git] / ld / emultempl / ppc32elf.em
CommitLineData
f9e6bfa8 1# This shell script emits a C file. -*- C -*-
82704155 2# Copyright (C) 2003-2019 Free Software Foundation, Inc.
f9e6bfa8 3#
f96b4a7b 4# This file is part of the GNU Binutils.
f9e6bfa8
AM
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
f96b4a7b 8# the Free Software Foundation; either version 3 of the License, or
f9e6bfa8
AM
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
f96b4a7b
NC
18# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19# MA 02110-1301, USA.
f9e6bfa8
AM
20#
21
c9a2f333 22# This file is sourced from elf32.em, and defines extra powerpc32-elf
f9e6bfa8
AM
23# specific routines.
24#
92b93329 25fragment <<EOF
f9e6bfa8 26
f9e6bfa8 27#include "elf32-ppc.h"
f05eb3b7 28#include "ldlex.h"
b4ab4364 29#include "ldlang.h"
f9e6bfa8 30
5503fea1
AM
31#define is_ppc_elf(bfd) \
32 (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
4dfe6ac6 33 && elf_object_id (bfd) == PPC32_ELF_DATA)
c9a2f333 34
f9e6bfa8
AM
35/* Whether to run tls optimization. */
36static int notlsopt = 0;
37
3e04d765
AM
38/* Whether to convert inline PLT calls to direct. */
39static int no_inline_opt = 0;
40
5446cbdf 41/* Choose the correct place for .got. */
0cf7d72c
AM
42static int old_got = 0;
43
407aa07c 44static struct ppc_elf_params params = { PLT_UNSET, 0, -1,
9e390558 45 0, 0, 0, 0, 0, 0, 0 };
5446cbdf
AM
46
47static void
48ppc_after_open_output (void)
49{
50 if (params.emit_stub_syms < 0)
0e1862bb
L
51 params.emit_stub_syms = (link_info.emitrelocations
52 || bfd_link_pic (&link_info));
76e7a751
AM
53 if (params.pagesize == 0)
54 params.pagesize = config.commonpagesize;
5446cbdf
AM
55 ppc_elf_link_params (&link_info, &params);
56}
57
db434ba0
AM
58EOF
59
60# No --secure-plt, --bss-plt, or --sdata-got for vxworks.
61if test -z "$VXWORKS_BASE_EM_FILE" ; then
62 fragment <<EOF
0cf7d72c 63static void
5c3261b0 64ppc_after_check_relocs (void)
0cf7d72c 65{
5503fea1 66 if (is_ppc_elf (link_info.output_bfd))
0cf7d72c
AM
67 {
68 int new_plt;
69 int keep_new;
70 unsigned int num_plt;
71 unsigned int num_got;
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];
75
5446cbdf 76 new_plt = ppc_elf_select_plt_layout (link_info.output_bfd, &link_info);
0cf7d72c 77 if (new_plt < 0)
d003af55 78 einfo (_("%X%P: select_plt_layout problem %E\n"));
0cf7d72c
AM
79
80 num_got = 0;
81 num_plt = 0;
5c1e6d53 82 for (os = &lang_os_list.head->output_section_statement;
0cf7d72c
AM
83 os != NULL;
84 os = os->next)
85 {
86 if (os->constraint == SPECIAL && strcmp (os->name, ".plt") == 0)
87 {
88 if (num_plt < 2)
89 plt_os[num_plt] = os;
90 ++num_plt;
91 }
92 if (os->constraint == SPECIAL && strcmp (os->name, ".got") == 0)
93 {
94 if (num_got < 2)
95 got_os[num_got] = os;
96 ++num_got;
97 }
98 }
99
100 keep_new = new_plt == 1 ? 0 : -1;
101 if (num_plt == 2)
102 {
103 plt_os[0]->constraint = keep_new;
104 plt_os[1]->constraint = ~keep_new;
105 }
106 if (num_got == 2)
107 {
108 if (old_got)
109 keep_new = -1;
110 got_os[0]->constraint = keep_new;
111 got_os[1]->constraint = ~keep_new;
112 }
113 }
114
5c3261b0 115 after_check_relocs_default ();
0cf7d72c
AM
116}
117
db434ba0
AM
118EOF
119fi
120fragment <<EOF
3e04d765
AM
121static void
122prelim_size_sections (void)
123{
124 if (expld.phase != lang_mark_phase_enum)
125 {
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 ();
131 }
132}
133
f9e6bfa8 134static void
7e5d8d48 135ppc_before_allocation (void)
f9e6bfa8 136{
5503fea1 137 if (is_ppc_elf (link_info.output_bfd))
f9e6bfa8 138 {
3e04d765
AM
139 if (!no_inline_opt
140 && !bfd_link_relocatable (&link_info))
141 {
142 prelim_size_sections ();
143
144 if (!ppc_elf_inline_plt (&link_info))
145 einfo (_("%X%P: inline PLT: %E\n"));
146 }
147
5446cbdf 148 if (ppc_elf_tls_setup (link_info.output_bfd, &link_info)
a7f2871e 149 && !notlsopt)
f9e6bfa8 150 {
f13a99db 151 if (!ppc_elf_tls_optimize (link_info.output_bfd, &link_info))
f9e6bfa8 152 {
d003af55 153 einfo (_("%X%P: TLS problem %E\n"));
f9e6bfa8
AM
154 return;
155 }
156 }
157 }
4135c73b 158
f9e6bfa8 159 gld${EMULATION_NAME}_before_allocation ();
4135c73b 160
93d1b056
AM
161 ppc_elf_maybe_strip_sdata_syms (&link_info);
162
5446cbdf
AM
163 if (RELAXATION_ENABLED)
164 params.branch_trampolines = 1;
165
4135c73b
AM
166 /* Turn on relaxation if executable sections have addresses that
167 might make branches overflow. */
5446cbdf 168 else if (!RELAXATION_DISABLED_BY_USER)
4135c73b
AM
169 {
170 bfd_vma low = (bfd_vma) -1;
171 bfd_vma high = 0;
172 asection *o;
173
7df6aecc
AM
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;
3e04d765 180 prelim_size_sections ();
4135c73b
AM
181
182 for (o = link_info.output_bfd->sections; o != NULL; o = o->next)
183 {
184 if ((o->flags & (SEC_ALLOC | SEC_CODE)) != (SEC_ALLOC | SEC_CODE))
185 continue;
07088e95 186 if (o->rawsize == 0)
4135c73b
AM
187 continue;
188 if (low > o->vma)
189 low = o->vma;
07088e95
AM
190 if (high < o->vma + o->rawsize - 1)
191 high = o->vma + o->rawsize - 1;
4135c73b
AM
192 }
193 if (high > low && high - low > (1 << 25) - 1)
5446cbdf 194 params.branch_trampolines = 1;
4135c73b 195 }
5446cbdf 196
d3e454b9
AM
197 if (params.branch_trampolines
198 || params.ppc476_workaround
199 || params.pic_fixup > 0)
5446cbdf 200 ENABLE_RELAXATION;
f9e6bfa8
AM
201}
202
b4ab4364
AM
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). */
209
210static void
211no_zero_padding (lang_statement_union_type *l)
212{
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)
218 {
219 struct _ppc_fill_type
220 {
221 size_t size;
222 unsigned char data[4];
223 };
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} };
226
227 if (bfd_big_endian (link_info.output_bfd))
228 l->padding_statement.fill = (struct _fill_type *) &fill_be;
229 else
230 l->padding_statement.fill = (struct _fill_type *) &fill_le;
231 }
232}
233
234static void
235ppc_finish (void)
236{
237 if (params.ppc476_workaround)
238 lang_for_each_statement (no_zero_padding);
49c09209
AM
239 if (!ppc_finish_symbols (&link_info))
240 einfo (_("%X%P: ppc_finish_symbols problem %E\n"));
b4ab4364
AM
241 finish_default ();
242}
243
f9e6bfa8
AM
244EOF
245
dc27aea4 246if grep -q 'ld_elf32_spu_emulation' ldemul-list.h; then
92b93329 247 fragment <<EOF
dc27aea4
AM
248/* Special handling for embedded SPU executables. */
249extern bfd_boolean embedded_spu_file (lang_input_statement_type *, const char *);
250static bfd_boolean gld${EMULATION_NAME}_load_symbols (lang_input_statement_type *);
251
252static bfd_boolean
253ppc_recognized_file (lang_input_statement_type *entry)
254{
255 if (embedded_spu_file (entry, "-m32"))
256 return TRUE;
257
258 return gld${EMULATION_NAME}_load_symbols (entry);
259}
260
261EOF
262LDEMUL_RECOGNIZED_FILE=ppc_recognized_file
263fi
264
f9e6bfa8
AM
265# Define some shell vars to insert bits of code into the standard elf
266# parse_args and list_options functions.
267#
58d180e8 268PARSE_AND_LIST_PROLOGUE=${PARSE_AND_LIST_PROLOGUE}'
9e390558
AM
269enum ppc32_opt
270{
271 OPTION_NO_TLS_OPT = 321,
272 OPTION_NO_TLS_GET_ADDR_OPT,
273 OPTION_NEW_PLT,
274 OPTION_OLD_PLT,
275 OPTION_PLT_ALIGN,
276 OPTION_NO_PLT_ALIGN,
3e04d765 277 OPTION_NO_INLINE_OPT,
9e390558
AM
278 OPTION_OLD_GOT,
279 OPTION_STUBSYMS,
280 OPTION_NO_STUBSYMS,
281 OPTION_PPC476_WORKAROUND,
282 OPTION_NO_PPC476_WORKAROUND,
283 OPTION_NO_PICFIXUP,
284 OPTION_VLE_RELOC_FIXUP
285};
f9e6bfa8
AM
286'
287
58d180e8 288PARSE_AND_LIST_LONGOPTS=${PARSE_AND_LIST_LONGOPTS}'
0ba07910 289 { "emit-stub-syms", no_argument, NULL, OPTION_STUBSYMS },
b02c4cfa 290 { "no-emit-stub-syms", no_argument, NULL, OPTION_NO_STUBSYMS },
f9e6bfa8 291 { "no-tls-optimize", no_argument, NULL, OPTION_NO_TLS_OPT },
db434ba0
AM
292 { "no-tls-get-addr-optimize", no_argument, NULL, OPTION_NO_TLS_GET_ADDR_OPT },'
293if test -z "$VXWORKS_BASE_EM_FILE" ; then
294 PARSE_AND_LIST_LONGOPTS=${PARSE_AND_LIST_LONGOPTS}'
016687f8 295 { "secure-plt", no_argument, NULL, OPTION_NEW_PLT },
0cf7d72c 296 { "bss-plt", no_argument, NULL, OPTION_OLD_PLT },
691d2e9a 297 { "plt-align", optional_argument, NULL, OPTION_PLT_ALIGN },
9e390558 298 { "no-plt-align", no_argument, NULL, OPTION_NO_PLT_ALIGN },
3e04d765 299 { "no-inline-optimize", no_argument, NULL, OPTION_NO_INLINE_OPT },
db434ba0
AM
300 { "sdata-got", no_argument, NULL, OPTION_OLD_GOT },'
301fi
302PARSE_AND_LIST_LONGOPTS=${PARSE_AND_LIST_LONGOPTS}'
5446cbdf
AM
303 { "ppc476-workaround", optional_argument, NULL, OPTION_PPC476_WORKAROUND },
304 { "no-ppc476-workaround", no_argument, NULL, OPTION_NO_PPC476_WORKAROUND },
d3e454b9 305 { "no-pic-fixup", no_argument, NULL, OPTION_NO_PICFIXUP },
08dc996f 306 { "vle-reloc-fixup", no_argument, NULL, OPTION_VLE_RELOC_FIXUP },
f9e6bfa8
AM
307'
308
58d180e8 309PARSE_AND_LIST_OPTIONS=${PARSE_AND_LIST_OPTIONS}'
f9e6bfa8 310 fprintf (file, _("\
df5f2391 311 --emit-stub-syms Label linker stubs with a symbol\n"
9e390558
AM
312 ));
313 fprintf (file, _("\
df5f2391 314 --no-emit-stub-syms Don'\''t label linker stubs with a symbol\n"
9e390558
AM
315 ));
316 fprintf (file, _("\
df5f2391 317 --no-tls-optimize Don'\''t try to optimize TLS accesses\n"
9e390558
AM
318 ));
319 fprintf (file, _("\
df5f2391 320 --no-tls-get-addr-optimize Don'\''t use a special __tls_get_addr call\n"
9e390558 321 ));'
db434ba0
AM
322if test -z "$VXWORKS_BASE_EM_FILE" ; then
323 PARSE_AND_LIST_OPTIONS=${PARSE_AND_LIST_OPTIONS}'\
9e390558 324 fprintf (file, _("\
df5f2391 325 --secure-plt Use new-style PLT if possible\n"
9e390558
AM
326 ));
327 fprintf (file, _("\
df5f2391 328 --bss-plt Force old-style BSS PLT\n"
9e390558
AM
329 ));
330 fprintf (file, _("\
df5f2391 331 --plt-align Align PLT call stubs to fit cache lines\n"
9e390558
AM
332 ));
333 fprintf (file, _("\
df5f2391 334 --no-plt-align Dont'\''t align individual PLT call stubs\n"
9e390558
AM
335 ));
336 fprintf (file, _("\
3e04d765
AM
337 --no-inline-optimize Don'\''t convert inline PLT to direct calls\n"
338 ));
339 fprintf (file, _("\
df5f2391 340 --sdata-got Force GOT location just before .sdata\n"
9e390558 341 ));'
db434ba0
AM
342fi
343PARSE_AND_LIST_OPTIONS=${PARSE_AND_LIST_OPTIONS}'\
9e390558 344 fprintf (file, _("\
5446cbdf 345 --ppc476-workaround [=pagesize]\n\
df5f2391 346 Avoid a cache bug on ppc476\n"
9e390558
AM
347 ));
348 fprintf (file, _("\
df5f2391 349 --no-ppc476-workaround Disable workaround\n"
9e390558
AM
350 ));
351 fprintf (file, _("\
df5f2391 352 --no-pic-fixup Don'\''t edit non-pic to pic\n"
9e390558
AM
353 ));
354 fprintf (file, _("\
df5f2391 355 --vle-reloc-fixup Correct old object file 16A/16D relocation\n"
f9e6bfa8
AM
356 ));
357'
358
58d180e8 359PARSE_AND_LIST_ARGS_CASES=${PARSE_AND_LIST_ARGS_CASES}'
0ba07910 360 case OPTION_STUBSYMS:
5446cbdf 361 params.emit_stub_syms = 1;
0ba07910
AM
362 break;
363
b02c4cfa 364 case OPTION_NO_STUBSYMS:
5446cbdf 365 params.emit_stub_syms = 0;
b02c4cfa
AM
366 break;
367
f9e6bfa8
AM
368 case OPTION_NO_TLS_OPT:
369 notlsopt = 1;
370 break;
0cf7d72c 371
a7f2871e 372 case OPTION_NO_TLS_GET_ADDR_OPT:
5446cbdf 373 params.no_tls_get_addr_opt = 1;
a7f2871e
AM
374 break;
375
016687f8 376 case OPTION_NEW_PLT:
5446cbdf 377 params.plt_style = PLT_NEW;
016687f8
AM
378 break;
379
0cf7d72c 380 case OPTION_OLD_PLT:
5446cbdf 381 params.plt_style = PLT_OLD;
0cf7d72c
AM
382 break;
383
9e390558 384 case OPTION_PLT_ALIGN:
691d2e9a
AM
385 if (optarg != NULL)
386 {
387 char *end;
388 unsigned long val = strtoul (optarg, &end, 0);
389 if (*end || val > 5)
df5f2391 390 einfo (_("%F%P: invalid --plt-align `%s'\''\n"), optarg);
691d2e9a
AM
391 params.plt_stub_align = val;
392 }
393 else
394 params.plt_stub_align = 5;
9e390558
AM
395 break;
396
397 case OPTION_NO_PLT_ALIGN:
398 params.plt_stub_align = 0;
399 break;
400
3e04d765
AM
401 case OPTION_NO_INLINE_OPT:
402 no_inline_opt = 1;
403 break;
404
0cf7d72c
AM
405 case OPTION_OLD_GOT:
406 old_got = 1;
407 break;
f05eb3b7
AM
408
409 case OPTION_TRADITIONAL_FORMAT:
410 notlsopt = 1;
5446cbdf 411 params.no_tls_get_addr_opt = 1;
f05eb3b7 412 return FALSE;
5446cbdf
AM
413
414 case OPTION_PPC476_WORKAROUND:
415 params.ppc476_workaround = 1;
416 if (optarg != NULL)
417 {
418 char *end;
76e7a751 419 params.pagesize = strtoul (optarg, &end, 0);
5446cbdf 420 if (*end
76e7a751
AM
421 || (params.pagesize < 4096 && params.pagesize != 0)
422 || params.pagesize != (params.pagesize & -params.pagesize))
df5f2391 423 einfo (_("%F%P: invalid pagesize `%s'\''\n"), optarg);
5446cbdf
AM
424 }
425 break;
426
427 case OPTION_NO_PPC476_WORKAROUND:
428 params.ppc476_workaround = 0;
429 break;
d3e454b9
AM
430
431 case OPTION_NO_PICFIXUP:
432 params.pic_fixup = -1;
433 break;
08dc996f
AM
434
435 case OPTION_VLE_RELOC_FIXUP:
436 params.vle_reloc_fixup = 1;
437 break;
f9e6bfa8
AM
438'
439
c9a2f333 440# Put these extra ppc32elf routines in ld_${EMULATION_NAME}_emulation
f9e6bfa8 441#
5446cbdf 442LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS=ppc_after_open_output
db434ba0 443if test -z "$VXWORKS_BASE_EM_FILE" ; then
5c3261b0 444 LDEMUL_AFTER_CHECK_RELOCS=ppc_after_check_relocs
db434ba0 445fi
f9e6bfa8 446LDEMUL_BEFORE_ALLOCATION=ppc_before_allocation
b4ab4364 447LDEMUL_FINISH=ppc_finish