diff options
author | Alan Modra <amodra@gmail.com> | 2005-05-11 14:10:10 +0000 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2005-05-11 14:10:10 +0000 |
commit | 0cf7d72c50cd48896b66849604286cc73d838161 (patch) | |
tree | c09ffd5807fa80c56cfabc90e29b928e9a7b4032 /ld/emultempl | |
parent | d7128ce4b13e32a44861403299d9541ed9b8827d (diff) | |
download | fsf-binutils-gdb-0cf7d72c50cd48896b66849604286cc73d838161.zip fsf-binutils-gdb-0cf7d72c50cd48896b66849604286cc73d838161.tar.gz fsf-binutils-gdb-0cf7d72c50cd48896b66849604286cc73d838161.tar.bz2 |
* ldgram.y: Add SPECIAL token.
(sect_constraint): Handle SPECIAL.
* ldlang.c (lang_output_section_find_1): Don't match SPECIAL.
(map_input_to_output_sections): Likewise.
* ldlex.l (SPECIAL): Define.
* emulparams/elf32ppc.sh (DATA_GOT, SDATA_GOT, SEPARATE_GOTPLT,
GOT, PLT, GOTPLT): Define.
* emultempl/ppc32elf.em (old_plt, old_got): New static vars.
(ppc_after_open): New function.
(PARSE_AND_LIST_PROLOGUE): Define OPTION_OLD_LPT and OPTION_OLD_GOT.
(PARSE_AND_LIST_LONGOPTS): Add "bss-plt" and "sdata-got".
(PARSE_AND_LIST_OPTIONS): Document them.
(PARSE_AND_LIST_ARGS_CASES): Handle them.
(LDEMUL_AFTER_OPEN): Define.
* scripttempl/elf.sc (PLT): Don't override existing define.
(DATA_GOT, SDATA_GOT): Define and use to enable alternate got
placement rather than using NO_SMALL_DATA. Emit GOTPLT for RELRO_NOW.
Diffstat (limited to 'ld/emultempl')
-rw-r--r-- | ld/emultempl/ppc32elf.em | 77 |
1 files changed, 76 insertions, 1 deletions
diff --git a/ld/emultempl/ppc32elf.em b/ld/emultempl/ppc32elf.em index 710160d..cbd77ac 100644 --- a/ld/emultempl/ppc32elf.em +++ b/ld/emultempl/ppc32elf.em @@ -32,6 +32,66 @@ extern const bfd_target bfd_elf32_powerpcle_vec; /* Whether to run tls optimization. */ static int notlsopt = 0; +/* Chooses the correct place for .plt and .got. */ +static int old_plt = 0; +static int old_got = 0; + +static void +ppc_after_open (void) +{ + if (link_info.hash->creator == &bfd_elf32_powerpc_vec + || link_info.hash->creator == &bfd_elf32_powerpcle_vec) + { + int new_plt; + int keep_new; + unsigned int num_plt; + unsigned int num_got; + lang_output_section_statement_type *os; + lang_output_section_statement_type *plt_os[2]; + lang_output_section_statement_type *got_os[2]; + + new_plt = ppc_elf_select_plt_layout (output_bfd, &link_info, old_plt); + if (new_plt < 0) + einfo ("%X%P: select_plt_layout problem %E\n"); + + num_got = 0; + num_plt = 0; + for (os = &lang_output_section_statement.head->output_section_statement; + os != NULL; + os = os->next) + { + if (os->constraint == SPECIAL && strcmp (os->name, ".plt") == 0) + { + if (num_plt < 2) + plt_os[num_plt] = os; + ++num_plt; + } + if (os->constraint == SPECIAL && strcmp (os->name, ".got") == 0) + { + if (num_got < 2) + got_os[num_got] = os; + ++num_got; + } + } + + keep_new = new_plt == 1 ? 0 : -1; + if (num_plt == 2) + { + plt_os[0]->constraint = keep_new; + plt_os[1]->constraint = ~keep_new; + } + if (num_got == 2) + { + if (old_got) + keep_new = -1; + got_os[0]->constraint = keep_new; + got_os[1]->constraint = ~keep_new; + } + } + + gld${EMULATION_NAME}_after_open (); +} + static void ppc_before_allocation (void) { @@ -68,15 +128,21 @@ EOF # PARSE_AND_LIST_PROLOGUE=' #define OPTION_NO_TLS_OPT 301 +#define OPTION_OLD_PLT 302 +#define OPTION_OLD_GOT 303 ' PARSE_AND_LIST_LONGOPTS=' { "no-tls-optimize", no_argument, NULL, OPTION_NO_TLS_OPT }, + { "bss-plt", no_argument, NULL, OPTION_OLD_PLT }, + { "sdata-got", no_argument, NULL, OPTION_OLD_GOT }, ' PARSE_AND_LIST_OPTIONS=' fprintf (file, _("\ - --no-tls-optimize Don'\''t try to optimize TLS accesses.\n" + --no-tls-optimize Don'\''t try to optimize TLS accesses.\n\ + --bss-plt Force old-style BSS PLT.\n\ + --sdata-got Force GOT location just before .sdata.\n" )); ' @@ -84,9 +150,18 @@ PARSE_AND_LIST_ARGS_CASES=' case OPTION_NO_TLS_OPT: notlsopt = 1; break; + + case OPTION_OLD_PLT: + old_plt = 1; + break; + + case OPTION_OLD_GOT: + old_got = 1; + break; ' # Put these extra ppc32elf routines in ld_${EMULATION_NAME}_emulation # +LDEMUL_AFTER_OPEN=ppc_after_open LDEMUL_BEFORE_ALLOCATION=ppc_before_allocation LDEMUL_AFTER_ALLOCATION=gld${EMULATION_NAME}_after_allocation |