diff options
author | Alan Modra <amodra@gmail.com> | 2016-11-22 18:45:29 +1030 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2016-11-22 20:19:29 +1030 |
commit | 08dc996fedde9143cda25720961684087b133640 (patch) | |
tree | 9bb48db13193c8e0839bc213eb2fc9ca8a73adb8 /ld/emultempl | |
parent | 95f0d0d2338f8eba18d2b3c8cbe15b1d584b885c (diff) | |
download | gdb-08dc996fedde9143cda25720961684087b133640.zip gdb-08dc996fedde9143cda25720961684087b133640.tar.gz gdb-08dc996fedde9143cda25720961684087b133640.tar.bz2 |
PR20744, Incorrect PowerPC VLE relocs
VLE 16A and 16D relocs were functionally swapped.
PR 20744
include/
* opcode/ppc.h: Define VLE insns using 16A and 16D relocs.
bfd/
* elf32-ppc.h (struct ppc_elf_params): Add vle_reloc_fixup field.
* elf32-ppc.c: Include opcode/ppc.h.
(ppc_elf_howto_raw): Correct dst_mask for R_PPC_VLE_LO16A,
R_PPC_VLE_LO16D, R_PPC_VLE_HI16A, R_PPC_VLE_HI16D, R_PPC_VLE_HA16A,
R_PPC_VLE_HA16D, R_PPC_VLE_SDAREL_LO16A, R_PPC_VLE_SDAREL_LO16D,
R_PPC_VLE_SDAREL_HI16A, R_PPC_VLE_SDAREL_HI16D,
R_PPC_VLE_SDAREL_HA16A, and R_PPC_VLE_SDAREL_HA16D relocs.
(ppc_elf_link_hash_table_create): Update default_params init.
(ppc_elf_vle_split16): Correct shift and mask. Add params.
Report or fix insn/reloc mismatches.
(ppc_elf_relocate_section): Pass input_section, offset and fixup
to ppc_elf_vle_split16.
binutils/
* NEWS: Mention PowerPC VLE relocation error.
gas/
* config/tc-ppc.c: Delete VLE insn defines.
(md_assemble): Swap use_a_reloc and use_d_reloc.
* testsuite/gas/ppc/vle-reloc.d: Update.
ld/
* emultempl/ppc32elf.em (params): Update initializer. Handle
--vle-reloc-fixup command line arg.
Diffstat (limited to 'ld/emultempl')
-rw-r--r-- | ld/emultempl/ppc32elf.em | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/ld/emultempl/ppc32elf.em b/ld/emultempl/ppc32elf.em index 95df30d..0e64ccf 100644 --- a/ld/emultempl/ppc32elf.em +++ b/ld/emultempl/ppc32elf.em @@ -38,7 +38,7 @@ static int notlsopt = 0; /* Choose the correct place for .got. */ static int old_got = 0; -static struct ppc_elf_params params = { PLT_UNSET, -1, 0, 0, 0, 0, 0, 0 }; +static struct ppc_elf_params params = { PLT_UNSET, -1, 0, 0, 0, 0, 0, 0, 0 }; static void ppc_after_open_output (void) @@ -249,6 +249,7 @@ PARSE_AND_LIST_PROLOGUE=${PARSE_AND_LIST_PROLOGUE}' #define OPTION_PPC476_WORKAROUND (OPTION_NO_STUBSYMS + 1) #define OPTION_NO_PPC476_WORKAROUND (OPTION_PPC476_WORKAROUND + 1) #define OPTION_NO_PICFIXUP (OPTION_NO_PPC476_WORKAROUND + 1) +#define OPTION_VLE_RELOC_FIXUP (OPTION_NO_PICFIXUP + 1) ' PARSE_AND_LIST_LONGOPTS=${PARSE_AND_LIST_LONGOPTS}' @@ -266,6 +267,7 @@ PARSE_AND_LIST_LONGOPTS=${PARSE_AND_LIST_LONGOPTS}' { "ppc476-workaround", optional_argument, NULL, OPTION_PPC476_WORKAROUND }, { "no-ppc476-workaround", no_argument, NULL, OPTION_NO_PPC476_WORKAROUND }, { "no-pic-fixup", no_argument, NULL, OPTION_NO_PICFIXUP }, + { "vle-reloc-fixup", no_argument, NULL, OPTION_VLE_RELOC_FIXUP }, ' PARSE_AND_LIST_OPTIONS=${PARSE_AND_LIST_OPTIONS}' @@ -284,7 +286,8 @@ PARSE_AND_LIST_OPTIONS=${PARSE_AND_LIST_OPTIONS}'\ --ppc476-workaround [=pagesize]\n\ Avoid a cache bug on ppc476.\n\ --no-ppc476-workaround Disable workaround.\n\ - --no-pic-fixup Don'\''t edit non-pic to pic.\n" + --no-pic-fixup Don'\''t edit non-pic to pic.\n\ + --vle-reloc-fixup Correct old object file 16A/16D relocation.\n" )); ' @@ -342,6 +345,10 @@ PARSE_AND_LIST_ARGS_CASES=${PARSE_AND_LIST_ARGS_CASES}' case OPTION_NO_PICFIXUP: params.pic_fixup = -1; break; + + case OPTION_VLE_RELOC_FIXUP: + params.vle_reloc_fixup = 1; + break; ' # Put these extra ppc32elf routines in ld_${EMULATION_NAME}_emulation |