mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-28 23:39:35 +08:00
x86: Treat relocation against IFUNC symbol as FUNC
When resolving a relocation against IFUNC symbol in a SHT_NOTE section without SHF_ALLOC, we treat it as relocation against FUNC symbol since it needs the address of IFUNC symbol, not the address returned by IFUNC function. bfd/ PR ld/22929 * elf32-i386.c (elf_i386_relocate_section): Treat relocation against IFUNC symbol in SHT_NOTE section without SHF_ALLOC as relocation against FUNC symbol. * elf64-x86-64.c (elf_x86_64_relocate_section): Likewise. ld/ PR ld/22929 * testsuite/ld-i386/i386.exp: Run PR ld/22929 test. * testsuite/ld-x86-64/x86-64.exp: Likewise. * testsuite/ld-i386/pr22929.d: New file. * testsuite/ld-i386/pr22929.s: Likewise. * testsuite/ld-x86-64/pr22929.d: Likewise. * testsuite/ld-x86-64/pr22929.s: Likewise.
This commit is contained in:
@ -1,3 +1,11 @@
|
|||||||
|
2018-03-08 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
|
PR ld/22929
|
||||||
|
* elf32-i386.c (elf_i386_relocate_section): Treat relocation
|
||||||
|
against IFUNC symbol in SHT_NOTE section without SHF_ALLOC as
|
||||||
|
relocation against FUNC symbol.
|
||||||
|
* elf64-x86-64.c (elf_x86_64_relocate_section): Likewise.
|
||||||
|
|
||||||
2018-03-07 Renlin Li <renlin.li@arm.com>
|
2018-03-07 Renlin Li <renlin.li@arm.com>
|
||||||
|
|
||||||
PR ld/20402
|
PR ld/20402
|
||||||
|
@ -2221,6 +2221,10 @@ elf_i386_relocate_section (bfd *output_bfd,
|
|||||||
|
|
||||||
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. */
|
||||||
@ -2440,6 +2444,7 @@ do_ifunc_pointer:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
skip_ifunc:
|
||||||
resolved_to_zero = (eh != NULL
|
resolved_to_zero = (eh != NULL
|
||||||
&& UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh));
|
&& UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh));
|
||||||
|
|
||||||
|
@ -2503,6 +2503,10 @@ elf_x86_64_relocate_section (bfd *output_bfd,
|
|||||||
|
|
||||||
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. */
|
||||||
@ -2726,6 +2730,7 @@ do_ifunc_pointer:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
skip_ifunc:
|
||||||
resolved_to_zero = (eh != NULL
|
resolved_to_zero = (eh != NULL
|
||||||
&& UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh));
|
&& UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh));
|
||||||
|
|
||||||
|
10
ld/ChangeLog
10
ld/ChangeLog
@ -1,3 +1,13 @@
|
|||||||
|
2018-03-08 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
|
PR ld/22929
|
||||||
|
* testsuite/ld-i386/i386.exp: Run PR ld/22929 test.
|
||||||
|
* testsuite/ld-x86-64/x86-64.exp: Likewise.
|
||||||
|
* testsuite/ld-i386/pr22929.d: New file.
|
||||||
|
* testsuite/ld-i386/pr22929.s: Likewise.
|
||||||
|
* testsuite/ld-x86-64/pr22929.d: Likewise.
|
||||||
|
* testsuite/ld-x86-64/pr22929.s: Likewise.
|
||||||
|
|
||||||
2018-03-07 Max Filippov <jcmvbkbc@gmail.com>
|
2018-03-07 Max Filippov <jcmvbkbc@gmail.com>
|
||||||
|
|
||||||
* emulparams/elf32xtensa.sh (COMMONPAGESIZE): Define.
|
* emulparams/elf32xtensa.sh (COMMONPAGESIZE): Define.
|
||||||
|
@ -459,6 +459,7 @@ run_dump_test "pr22115-1c"
|
|||||||
run_dump_test "pr22115-1d"
|
run_dump_test "pr22115-1d"
|
||||||
run_dump_test "pr22135"
|
run_dump_test "pr22135"
|
||||||
run_dump_test "pr22782"
|
run_dump_test "pr22782"
|
||||||
|
run_dump_test "pr22929"
|
||||||
|
|
||||||
if { !([istarget "i?86-*-linux*"]
|
if { !([istarget "i?86-*-linux*"]
|
||||||
|| [istarget "i?86-*-gnu*"]
|
|| [istarget "i?86-*-gnu*"]
|
||||||
|
11
ld/testsuite/ld-i386/pr22929.d
Normal file
11
ld/testsuite/ld-i386/pr22929.d
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#as: --32
|
||||||
|
#ld: -melf_i386 -shared
|
||||||
|
#readelf: -r --wide -s
|
||||||
|
|
||||||
|
There are no relocations in this file.
|
||||||
|
#...
|
||||||
|
Symbol table '.symtab' contains [0-9]+ entries:
|
||||||
|
Num: Value Size Type Bind Vis Ndx Name
|
||||||
|
#...
|
||||||
|
[ \t]+[a-f0-9]+: [a-f0-9]+ +1 IFUNC +GLOBAL DEFAULT +[a-f0-9]+ +foo
|
||||||
|
#...
|
21
ld/testsuite/ld-i386/pr22929.s
Normal file
21
ld/testsuite/ld-i386/pr22929.s
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
.text
|
||||||
|
.globl foo
|
||||||
|
.type foo, %gnu_indirect_function
|
||||||
|
foo:
|
||||||
|
ret
|
||||||
|
.size foo, .-foo
|
||||||
|
.pushsection .gnu.build.attributes, "", %note
|
||||||
|
.dc.l 6 # size of name
|
||||||
|
.dc.l 16 # descsz = sizeof (addresses)
|
||||||
|
.dc.l 0x101 # type = FUNC
|
||||||
|
.dc.b 0x47, 0x41, 0x2a, 0x2, 0, 0 # name (numeric: -fstack-protector status)
|
||||||
|
.dc.b 0, 0 # Padding
|
||||||
|
.dc.a foo
|
||||||
|
.dc.a foo_end # description (symbol name)
|
||||||
|
.popsection
|
||||||
|
|
||||||
|
foo_end:
|
||||||
|
.section .rodata.cst4,"aM",@progbits,4
|
||||||
|
.align 4
|
||||||
|
.LC0:
|
||||||
|
.long 1065353216
|
11
ld/testsuite/ld-x86-64/pr22929.d
Normal file
11
ld/testsuite/ld-x86-64/pr22929.d
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#as: --64
|
||||||
|
#ld: -melf_x86_64 -shared
|
||||||
|
#readelf: -r --wide -s
|
||||||
|
|
||||||
|
There are no relocations in this file.
|
||||||
|
#...
|
||||||
|
Symbol table '.symtab' contains [0-9]+ entries:
|
||||||
|
Num: Value Size Type Bind Vis Ndx Name
|
||||||
|
#...
|
||||||
|
[ \t]+[a-f0-9]+: [a-f0-9]+ +1 IFUNC +GLOBAL DEFAULT +[a-f0-9]+ +foo
|
||||||
|
#...
|
21
ld/testsuite/ld-x86-64/pr22929.s
Normal file
21
ld/testsuite/ld-x86-64/pr22929.s
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
.text
|
||||||
|
.globl foo
|
||||||
|
.type foo, %gnu_indirect_function
|
||||||
|
foo:
|
||||||
|
ret
|
||||||
|
.size foo, .-foo
|
||||||
|
.pushsection .gnu.build.attributes, "", %note
|
||||||
|
.dc.l 6 # size of name
|
||||||
|
.dc.l 16 # descsz = sizeof (addresses)
|
||||||
|
.dc.l 0x101 # type = FUNC
|
||||||
|
.dc.b 0x47, 0x41, 0x2a, 0x2, 0, 0 # name (numeric: -fstack-protector status)
|
||||||
|
.dc.b 0, 0 # Padding
|
||||||
|
.dc.a foo
|
||||||
|
.dc.a foo_end # description (symbol name)
|
||||||
|
.popsection
|
||||||
|
|
||||||
|
foo_end:
|
||||||
|
.section .rodata.cst4,"aM",@progbits,4
|
||||||
|
.align 4
|
||||||
|
.LC0:
|
||||||
|
.long 1065353216
|
@ -605,6 +605,7 @@ run_dump_test "pr20253-5a"
|
|||||||
run_dump_test "pr20253-5b"
|
run_dump_test "pr20253-5b"
|
||||||
run_dump_test "tlsdesc2"
|
run_dump_test "tlsdesc2"
|
||||||
run_dump_test "pr22048"
|
run_dump_test "pr22048"
|
||||||
|
run_dump_test "pr22929"
|
||||||
|
|
||||||
proc undefined_weak {cflags ldflags} {
|
proc undefined_weak {cflags ldflags} {
|
||||||
set testname "Undefined weak symbol"
|
set testname "Undefined weak symbol"
|
||||||
|
Reference in New Issue
Block a user