mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-23 03:29:47 +08:00
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.
This commit is contained in:
@ -1,3 +1,14 @@
|
|||||||
|
2018-03-09 Nick Clifton <nickc@redhat.com>
|
||||||
|
|
||||||
|
* 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.
|
||||||
|
|
||||||
2018-03-08 H.J. Lu <hongjiu.lu@intel.com>
|
2018-03-08 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
PR ld/22929
|
PR ld/22929
|
||||||
|
@ -2605,6 +2605,9 @@ elf_s390_relocate_section (bfd *output_bfd,
|
|||||||
case R_390_8:
|
case R_390_8:
|
||||||
case R_390_16:
|
case R_390_16:
|
||||||
case R_390_32:
|
case R_390_32:
|
||||||
|
if ((input_section->flags & SEC_ALLOC) == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
if (h != NULL
|
if (h != NULL
|
||||||
&& s390_is_ifunc_symbol_p (h)
|
&& s390_is_ifunc_symbol_p (h)
|
||||||
&& h->def_regular)
|
&& h->def_regular)
|
||||||
@ -2666,9 +2669,6 @@ elf_s390_relocate_section (bfd *output_bfd,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((input_section->flags & SEC_ALLOC) == 0)
|
|
||||||
break;
|
|
||||||
|
|
||||||
if ((bfd_link_pic (info)
|
if ((bfd_link_pic (info)
|
||||||
&& (h == NULL
|
&& (h == NULL
|
||||||
|| (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
|
|| (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
|
||||||
|
@ -2565,6 +2565,9 @@ elf_s390_relocate_section (bfd *output_bfd,
|
|||||||
case R_390_32:
|
case R_390_32:
|
||||||
case R_390_64:
|
case R_390_64:
|
||||||
|
|
||||||
|
if ((input_section->flags & SEC_ALLOC) == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
if (h != NULL
|
if (h != NULL
|
||||||
&& s390_is_ifunc_symbol_p (h)
|
&& s390_is_ifunc_symbol_p (h)
|
||||||
&& h->def_regular)
|
&& h->def_regular)
|
||||||
@ -2627,9 +2630,6 @@ elf_s390_relocate_section (bfd *output_bfd,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((input_section->flags & SEC_ALLOC) == 0)
|
|
||||||
break;
|
|
||||||
|
|
||||||
if ((bfd_link_pic (info)
|
if ((bfd_link_pic (info)
|
||||||
&& (h == NULL
|
&& (h == NULL
|
||||||
|| (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
|
|| (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
|
||||||
|
@ -5110,6 +5110,11 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto,
|
|||||||
|
|
||||||
if ((input_section->flags & SEC_ALLOC) == 0)
|
if ((input_section->flags & SEC_ALLOC) == 0)
|
||||||
{
|
{
|
||||||
|
/* If this is a SHT_NOTE section without SHF_ALLOC, treat
|
||||||
|
STT_GNU_IFUNC symbol as STT_FUNC. */
|
||||||
|
if (elf_section_type (input_section) == SHT_NOTE)
|
||||||
|
goto skip_ifunc;
|
||||||
|
|
||||||
/* Dynamic relocs are not propagated for SEC_DEBUGGING
|
/* Dynamic relocs are not propagated for SEC_DEBUGGING
|
||||||
sections because such sections are not SEC_ALLOC and
|
sections because such sections are not SEC_ALLOC and
|
||||||
thus ld.so will not process them. */
|
thus ld.so will not process them. */
|
||||||
@ -5305,6 +5310,7 @@ bad_ifunc_reloc:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
skip_ifunc:
|
||||||
resolved_to_zero = (h != NULL
|
resolved_to_zero = (h != NULL
|
||||||
&& UNDEFWEAK_NO_DYNAMIC_RELOC (info, h));
|
&& UNDEFWEAK_NO_DYNAMIC_RELOC (info, h));
|
||||||
|
|
||||||
|
@ -3001,7 +3001,13 @@ _bfd_sparc_elf_relocate_section (bfd *output_bfd,
|
|||||||
|
|
||||||
if ((input_section->flags & SEC_ALLOC) == 0
|
if ((input_section->flags & SEC_ALLOC) == 0
|
||||||
|| h->plt.offset == (bfd_vma) -1)
|
|| h->plt.offset == (bfd_vma) -1)
|
||||||
abort ();
|
{
|
||||||
|
/* If this is a SHT_NOTE section without SHF_ALLOC, treat
|
||||||
|
STT_GNU_IFUNC symbol as STT_FUNC. */
|
||||||
|
if (elf_section_type (input_section) == SHT_NOTE)
|
||||||
|
goto skip_ifunc;
|
||||||
|
abort ();
|
||||||
|
}
|
||||||
|
|
||||||
plt_sec = htab->elf.splt;
|
plt_sec = htab->elf.splt;
|
||||||
if (! plt_sec)
|
if (! plt_sec)
|
||||||
@ -3105,6 +3111,7 @@ _bfd_sparc_elf_relocate_section (bfd *output_bfd,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
skip_ifunc:
|
||||||
eh = (struct _bfd_sparc_elf_link_hash_entry *) h;
|
eh = (struct _bfd_sparc_elf_link_hash_entry *) h;
|
||||||
resolved_to_zero = eh && UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh);
|
resolved_to_zero = eh && UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh);
|
||||||
|
|
||||||
|
@ -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>
|
2018-03-08 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
PR ld/22929
|
PR ld/22929
|
||||||
|
@ -47,6 +47,9 @@ if ![check_shared_lib_support] {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# This test does not need a compiler...
|
||||||
|
run_dump_test "ifuncmod5"
|
||||||
|
|
||||||
# We need a working compiler. (Strictly speaking this is
|
# We need a working compiler. (Strictly speaking this is
|
||||||
# not true, we could use target specific assembler files).
|
# not true, we could use target specific assembler files).
|
||||||
if { [which $CC] == 0 } {
|
if { [which $CC] == 0 } {
|
||||||
|
8
ld/testsuite/ld-ifunc/ifuncmod5.d
Normal file
8
ld/testsuite/ld-ifunc/ifuncmod5.d
Normal file
@ -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
|
||||||
|
|
105
ld/testsuite/ld-ifunc/ifuncmod5.s
Normal file
105
ld/testsuite/ld-ifunc/ifuncmod5.s
Normal file
@ -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
|
||||||
|
|
||||||
|
|
Reference in New Issue
Block a user