diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2022-07-21 10:35:58 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2022-07-22 14:46:22 -0700 |
commit | 5c0b4ee406035917d0e50aa138194fab57ae6bf8 (patch) | |
tree | 80f3ce336e1b432a435ede51de3ab333d6dec002 /bfd/elf32-i386.c | |
parent | 19892fedb7b7e9129d76a0c48b26721d4973fb20 (diff) |
i386: Don't allow GOTOFF relocation against IFUNC symbol for PIClinaro-local/ci/tcwg_kernel/llvm-release-arm-stable-defconfiglinaro-local/ci/tcwg_kernel/llvm-release-arm-stable-allyesconfiglinaro-local/ci/tcwg_kernel/llvm-release-arm-stable-allnoconfiglinaro-local/ci/tcwg_kernel/llvm-release-arm-stable-allmodconfiglinaro-local/ci/tcwg_kernel/llvm-release-arm-norov-defconfiglinaro-local/ci/tcwg_kernel/llvm-release-arm-norov-allyesconfiglinaro-local/ci/tcwg_kernel/llvm-release-arm-norov-allnoconfiglinaro-local/ci/tcwg_kernel/llvm-release-arm-norov-allmodconfiglinaro-local/ci/tcwg_kernel/llvm-release-arm-next-defconfiglinaro-local/ci/tcwg_kernel/llvm-release-arm-next-allyesconfiglinaro-local/ci/tcwg_kernel/llvm-release-arm-next-allnoconfiglinaro-local/ci/tcwg_kernel/llvm-release-arm-next-allmodconfiglinaro-local/ci/tcwg_kernel/llvm-release-arm-mainline-defconfiglinaro-local/ci/tcwg_kernel/llvm-release-arm-mainline-allyesconfiglinaro-local/ci/tcwg_kernel/llvm-release-arm-mainline-allnoconfiglinaro-local/ci/tcwg_kernel/llvm-release-arm-mainline-allmodconfiglinaro-local/ci/tcwg_kernel/llvm-release-arm-lts-defconfiglinaro-local/ci/tcwg_kernel/llvm-release-arm-lts-allyesconfiglinaro-local/ci/tcwg_kernel/llvm-release-arm-lts-allnoconfiglinaro-local/ci/tcwg_kernel/llvm-release-arm-lts-allmodconfiglinaro-local/ci/tcwg_kernel/llvm-release-aarch64-stable-defconfiglinaro-local/ci/tcwg_kernel/llvm-release-aarch64-stable-allyesconfiglinaro-local/ci/tcwg_kernel/llvm-release-aarch64-stable-allnoconfiglinaro-local/ci/tcwg_kernel/llvm-release-aarch64-stable-allmodconfiglinaro-local/ci/tcwg_kernel/llvm-release-aarch64-norov-defconfiglinaro-local/ci/tcwg_kernel/llvm-release-aarch64-norov-allyesconfiglinaro-local/ci/tcwg_kernel/llvm-release-aarch64-norov-allnoconfiglinaro-local/ci/tcwg_kernel/llvm-release-aarch64-norov-allmodconfiglinaro-local/ci/tcwg_kernel/llvm-release-aarch64-next-defconfiglinaro-local/ci/tcwg_kernel/llvm-release-aarch64-next-allyesconfiglinaro-local/ci/tcwg_kernel/llvm-release-aarch64-next-allnoconfiglinaro-local/ci/tcwg_kernel/llvm-release-aarch64-next-allmodconfiglinaro-local/ci/tcwg_kernel/llvm-release-aarch64-mainline-defconfiglinaro-local/ci/tcwg_kernel/llvm-release-aarch64-mainline-allyesconfiglinaro-local/ci/tcwg_kernel/llvm-release-aarch64-mainline-allnoconfiglinaro-local/ci/tcwg_kernel/llvm-release-aarch64-mainline-allmodconfiglinaro-local/ci/tcwg_kernel/llvm-release-aarch64-lts-defconfiglinaro-local/ci/tcwg_kernel/llvm-release-aarch64-lts-allyesconfiglinaro-local/ci/tcwg_kernel/llvm-release-aarch64-lts-allnoconfiglinaro-local/ci/tcwg_kernel/llvm-release-aarch64-lts-allmodconfiglinaro-local/ci/tcwg_kernel/gnu-release-arm-stable-defconfiglinaro-local/ci/tcwg_kernel/gnu-release-arm-stable-allyesconfiglinaro-local/ci/tcwg_kernel/gnu-release-arm-stable-allnoconfiglinaro-local/ci/tcwg_kernel/gnu-release-arm-stable-allmodconfiglinaro-local/ci/tcwg_kernel/gnu-release-arm-norov-defconfiglinaro-local/ci/tcwg_kernel/gnu-release-arm-norov-allyesconfiglinaro-local/ci/tcwg_kernel/gnu-release-arm-norov-allnoconfiglinaro-local/ci/tcwg_kernel/gnu-release-arm-norov-allmodconfiglinaro-local/ci/tcwg_kernel/gnu-release-arm-next-defconfiglinaro-local/ci/tcwg_kernel/gnu-release-arm-next-allyesconfiglinaro-local/ci/tcwg_kernel/gnu-release-arm-next-allnoconfiglinaro-local/ci/tcwg_kernel/gnu-release-arm-next-allmodconfiglinaro-local/ci/tcwg_kernel/gnu-release-arm-mainline-defconfiglinaro-local/ci/tcwg_kernel/gnu-release-arm-mainline-allyesconfiglinaro-local/ci/tcwg_kernel/gnu-release-arm-mainline-allnoconfiglinaro-local/ci/tcwg_kernel/gnu-release-arm-mainline-allmodconfiglinaro-local/ci/tcwg_kernel/gnu-release-arm-lts-defconfiglinaro-local/ci/tcwg_kernel/gnu-release-arm-lts-allyesconfiglinaro-local/ci/tcwg_kernel/gnu-release-arm-lts-allnoconfiglinaro-local/ci/tcwg_kernel/gnu-release-arm-lts-allmodconfiglinaro-local/ci/tcwg_kernel/gnu-release-aarch64-stable-defconfiglinaro-local/ci/tcwg_kernel/gnu-release-aarch64-stable-allyesconfiglinaro-local/ci/tcwg_kernel/gnu-release-aarch64-stable-allnoconfiglinaro-local/ci/tcwg_kernel/gnu-release-aarch64-stable-allmodconfiglinaro-local/ci/tcwg_kernel/gnu-release-aarch64-norov-defconfiglinaro-local/ci/tcwg_kernel/gnu-release-aarch64-norov-allyesconfiglinaro-local/ci/tcwg_kernel/gnu-release-aarch64-norov-allnoconfiglinaro-local/ci/tcwg_kernel/gnu-release-aarch64-norov-allmodconfiglinaro-local/ci/tcwg_kernel/gnu-release-aarch64-next-defconfiglinaro-local/ci/tcwg_kernel/gnu-release-aarch64-next-allyesconfiglinaro-local/ci/tcwg_kernel/gnu-release-aarch64-next-allnoconfiglinaro-local/ci/tcwg_kernel/gnu-release-aarch64-next-allmodconfiglinaro-local/ci/tcwg_kernel/gnu-release-aarch64-mainline-defconfiglinaro-local/ci/tcwg_kernel/gnu-release-aarch64-mainline-allyesconfiglinaro-local/ci/tcwg_kernel/gnu-release-aarch64-mainline-allnoconfiglinaro-local/ci/tcwg_kernel/gnu-release-aarch64-mainline-allmodconfiglinaro-local/ci/tcwg_kernel/gnu-release-aarch64-lts-defconfiglinaro-local/ci/tcwg_kernel/gnu-release-aarch64-lts-allyesconfiglinaro-local/ci/tcwg_kernel/gnu-release-aarch64-lts-allnoconfiglinaro-local/ci/tcwg_kernel/gnu-release-aarch64-lts-allmodconfiglinaro-local/ci/tcwg_bmk_llvm_tx1/llvm-release-aarch64-spec2k6-O3_LTOlinaro-local/ci/tcwg_bmk_llvm_tx1/llvm-release-aarch64-spec2k6-O3linaro-local/ci/tcwg_bmk_llvm_tx1/llvm-release-aarch64-spec2k6-O2_LTOlinaro-local/ci/tcwg_bmk_llvm_tx1/llvm-release-aarch64-spec2k6-O2linaro-local/ci/tcwg_bmk_llvm_tk1/llvm-release-arm-spec2k6-O3_LTOlinaro-local/ci/tcwg_bmk_llvm_tk1/llvm-release-arm-spec2k6-O3linaro-local/ci/tcwg_bmk_llvm_sq/llvm-release-aarch64-spec2k6-Oslinaro-local/ci/tcwg_bmk_llvm_apm/llvm-release-arm-spec2k6-Oz_LTOlinaro-local/ci/tcwg_bmk_llvm_apm/llvm-release-arm-spec2k6-Ozlinaro-local/ci/tcwg_bmk_llvm_apm/llvm-release-arm-spec2k6-Os_LTOlinaro-local/ci/tcwg_bmk_llvm_apm/llvm-release-arm-spec2k6-Oslinaro-local/ci/tcwg_bmk_llvm_apm/llvm-release-aarch64-spec2k6-Ozlinaro-local/ci/tcwg_bmk_llvm_apm/llvm-release-aarch64-spec2k6-Os_LTOlinaro-local/ci/tcwg_bmk_gnu_tx1/gnu-release-aarch64-spec2k6-O3_LTOlinaro-local/ci/tcwg_bmk_gnu_tx1/gnu-release-aarch64-spec2k6-O3linaro-local/ci/tcwg_bmk_gnu_tx1/gnu-release-aarch64-spec2k6-O2_LTOlinaro-local/ci/tcwg_bmk_gnu_tx1/gnu-release-aarch64-spec2k6-O2linaro-local/ci/tcwg_bmk_gnu_tk1/gnu-release-arm-spec2k6-O3_LTOlinaro-local/ci/tcwg_bmk_gnu_tk1/gnu-release-arm-spec2k6-O3linaro-local/ci/tcwg_bmk_gnu_tk1/gnu-release-arm-spec2k6-O2_LTOlinaro-local/ci/tcwg_bmk_gnu_tk1/gnu-release-arm-spec2k6-O2linaro-local/ci/tcwg_bmk_gnu_sq/gnu-release-aarch64-spec2k6-Oslinaro-local/ci/tcwg_bmk_gnu_eabi_stm32/gnu_eabi-release-arm_eabi-coremark-Oslinaro-local/ci/tcwg_bmk_gnu_eabi_stm32/gnu_eabi-release-arm_eabi-coremark-O3_LTOlinaro-local/ci/tcwg_bmk_gnu_eabi_stm32/gnu_eabi-release-arm_eabi-coremark-O3linaro-local/ci/tcwg_bmk_gnu_apm/gnu-release-arm-spec2k6-Os_LTOlinaro-local/ci/tcwg_bmk_gnu_apm/gnu-release-arm-spec2k6-Oslinaro-local/ci/tcwg_bmk_gnu_apm/gnu-release-aarch64-spec2k6-Os
We can't use the PLT entry as the function address for PIC since the PIC
register may not be set up properly for indirect call.
bfd/
PR ld/27998
* elf32-i386.c (elf_i386_relocate_section): Don't allow GOTOFF
relocation against IFUNC symbol for PIC.
ld/
PR ld/27998
* testsuite/ld-i386/pr27998a.d: Replace -shared with -e bar.
* testsuite/ld-i386/pr27998b.d: Expect a linker error.
* testsuite/ld-ifunc/ifunc-2-i386-now.d: Updated.
* testsuite/ld-ifunc/ifunc-2-local-i386-now.d: Likewise.
* testsuite/ld-ifunc/ifunc-2-i386.s: Replace @GOTOFF with @GOT.
* testsuite/ld-ifunc/ifunc-2-local-i386.s: Likewise.
(cherry picked from commit 8f29211c3f0a6335c17e0a90396c146facf6dba4)
Diffstat (limited to 'bfd/elf32-i386.c')
-rw-r--r-- | bfd/elf32-i386.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c index 94a23bf30a..6666871c40 100644 --- a/bfd/elf32-i386.c +++ b/bfd/elf32-i386.c @@ -2461,6 +2461,11 @@ elf_i386_relocate_section (bfd *output_bfd, goto do_relocation; case R_386_GOTOFF: + /* NB: We can't use the PLT entry as the function address + for PIC since the PIC register may not be set up + properly for indirect call. */ + if (bfd_link_pic (info)) + goto bad_ifunc_reloc; relocation -= (gotplt->output_section->vma + gotplt->output_offset); goto do_relocation; |