diff options
author | Nick Clifton <nickc@redhat.com> | 2018-03-09 14:37:36 +0000 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2018-03-09 14:37:36 +0000 |
commit | f657f8c4a1dc0ac69b16b1dc6eacbf5286f1f0a0 (patch) | |
tree | cd660cfaf14687bc4785722975206591959142d8 /ld | |
parent | 9bd8e0b072ad5fc5b8956fd5d3e51dc5a9b0f236 (diff) | |
download | gdb-f657f8c4a1dc0ac69b16b1dc6eacbf5286f1f0a0.zip gdb-f657f8c4a1dc0ac69b16b1dc6eacbf5286f1f0a0.tar.gz gdb-f657f8c4a1dc0ac69b16b1dc6eacbf5286f1f0a0.tar.bz2 |
Fix Sparc, s390 and AArch64 targets so that they can handle relocs against ifunc symbols found in note sections.
Following on from PR 22929, I have found the same problem exists with
other ifunc supporting targets too. Plus see this link for the bug
being reported against the s390x binutils for Fedora rawhide:
https://bugzilla.redhat.com/show_bug.cgi?id=1553705
So I am going to check in the patch below which applies the same
change that H.J. made for the x86_64 target to the other affected
targets. (Specifically: S390, AArch64 and Sparc). Plus it adds a new
test to the linker testsuite to make sure that this problem stays
fixed.
bfd * elf64-s390.c (elf_s390_relocate_section): Move check for
relocations against non-allocated sections to before the code that
handles ifunc relocations.
* elf32-s390.c (elf_s390_relocate_section): Likewise.
* elfnn-aarch64.c (elfNN_aarch64_final_link_relocate): Treat
relocs against IFUNC symbols in non-allocated sections as relocs
against FUNC symbols.
* elfxx-sparc.c (_bfd_sparc_elf_relocate_section): Likewise.
ld * testsuite/ld-ifunc/ifuncmod5.s: New test. Checks that targets
that support IFUNC symbols can handle relocations against those
symbols in NOTE sections.
* testsuite/ld-ifunc/ifuncmod5.d: New file: Driver for the new
test.
* testsuite/ld-ifunc/ifunc.exp: Run the new test.
Diffstat (limited to 'ld')
-rw-r--r-- | ld/ChangeLog | 9 | ||||
-rw-r--r-- | ld/testsuite/ld-ifunc/ifunc.exp | 3 | ||||
-rw-r--r-- | ld/testsuite/ld-ifunc/ifuncmod5.d | 8 | ||||
-rw-r--r-- | ld/testsuite/ld-ifunc/ifuncmod5.s | 105 |
4 files changed, 125 insertions, 0 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog index f37bdab..3b54069 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,12 @@ +2018-03-09 Nick Clifton <nickc@redhat.com> + + * testsuite/ld-ifunc/ifuncmod5.s: New test. Checks that targets + that support IFUNC symbols can handle relocations against those + symbols in NOTE sections. + * testsuite/ld-ifunc/ifuncmod5.d: New file: Driver for the new + test. + * testsuite/ld-ifunc/ifunc.exp: Run the new test. + 2018-03-08 H.J. Lu <hongjiu.lu@intel.com> PR ld/22929 diff --git a/ld/testsuite/ld-ifunc/ifunc.exp b/ld/testsuite/ld-ifunc/ifunc.exp index cb019d9..6eec579 100644 --- a/ld/testsuite/ld-ifunc/ifunc.exp +++ b/ld/testsuite/ld-ifunc/ifunc.exp @@ -47,6 +47,9 @@ if ![check_shared_lib_support] { return } +# This test does not need a compiler... +run_dump_test "ifuncmod5" + # We need a working compiler. (Strictly speaking this is # not true, we could use target specific assembler files). if { [which $CC] == 0 } { diff --git a/ld/testsuite/ld-ifunc/ifuncmod5.d b/ld/testsuite/ld-ifunc/ifuncmod5.d new file mode 100644 index 0000000..654d583 --- /dev/null +++ b/ld/testsuite/ld-ifunc/ifuncmod5.d @@ -0,0 +1,8 @@ +# name: Reloc against IFUNC symbol in NOTE section +# ld: -shared +# nm: -p + +# We do not actually care about the notes at the moment. +# The purpose of this test is to make sure that the link completes successfully. +#pass + diff --git a/ld/testsuite/ld-ifunc/ifuncmod5.s b/ld/testsuite/ld-ifunc/ifuncmod5.s new file mode 100644 index 0000000..97f5263 --- /dev/null +++ b/ld/testsuite/ld-ifunc/ifuncmod5.s @@ -0,0 +1,105 @@ + .file "ifuncmod5.c" + + .text + .type ifuncmod5.c, STT_NOTYPE +ifuncmod5.c: + .size ifuncmod5.c, 0 + + .pushsection .gnu.build.attributes, "", %note + .balign 4 + .dc.l 8 + .dc.l 16 + .dc.l 0x100 + .asciz "GA$3p4" + .dc.a ifuncmod5.c + .dc.a ifuncmod5.c_end + .popsection + +.Ltext0: +#APP + .protected global + .type foo, %gnu_indirect_function + .type foo_hidden, %gnu_indirect_function + .type foo_protected, %gnu_indirect_function + .hidden foo_hidden + .protected foo_protected +#NO_APP + .align 8 + .type one, %function +one: + .dc.l 0 + .size one, .-one + .align 8 + +.globl foo + .type foo, %function +foo: + .dc.l 0 + .size foo, .-foo + + .pushsection .gnu.build.attributes + .dc.l 6 + .dc.l 16 + .dc.l 0x101 + .dc.b 0x47, 0x41, 0x2a, 0x2, 0, 0 + .dc.b 0, 0 + .dc.a foo + .dc.a foo_end + .popsection + +foo_end: + .align 8 +.globl foo_hidden + .type foo_hidden, %function +foo_hidden: + .dc.l 0 + .size foo_hidden, .-foo_hidden + + .pushsection .gnu.build.attributes + .dc.l 6 + .dc.l 16 + .dc.l 0x101 + .dc.b 0x47, 0x41, 0x2a, 0x2, 0, 0 + .dc.b 0, 0 + .dc.a foo_hidden + .dc.a foo_hidden_end + .popsection + +foo_hidden_end: + .align 8 + + .globl foo_protected + .type foo_protected, %function +foo_protected: + .dc.l 0 + + .size foo_protected, .-foo_protected + + .pushsection .gnu.build.attributes + .dc.l 6 + .dc.l 16 + .dc.l 0x101 + .dc.b 0x47, 0x41, 0x2a, 0x2, 0, 0 + .dc.b 0, 0 + .dc.a foo_protected + .dc.a foo_protected_end + .popsection + +foo_protected_end: + .globl global + + .data + .align 4 + .type global, %object + .size global, 4 +global: + .long -1 + + .text + .Letext0: + +ifuncmod5.c_end: + .type ifuncmod5.c_end, STT_NOTYPE + .size ifuncmod5.c_end, 0 + + |