mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-08-01 17:27:15 +08:00
x86-64: Use .plt.bnd for IFUNC function address
When -z bndplt is used, we must use the .plt.bnd entry for IFUNC function address. bfd/ PR ld/21481 * elf64-x86-64.c (elf_x86_64_finish_dynamic_symbol): Use .plt.bnd for IFUNC function address. ld/ PR ld/21481 * testsuite/ld-x86-64/pr21481a.c: New file. * testsuite/ld-x86-64/pr21481b.S: Likewise. * testsuite/ld-x86-64/x86-64.exp: Run PR ld/21481 tests.
This commit is contained in:
@ -1,3 +1,9 @@
|
|||||||
|
2017-05-10 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
|
PR ld/21481
|
||||||
|
* elf64-x86-64.c (elf_x86_64_finish_dynamic_symbol): Use .plt.bnd
|
||||||
|
for IFUNC function address.
|
||||||
|
|
||||||
2017-05-10 Claudiu Zissulescu <claziss@synopsys.com>
|
2017-05-10 Claudiu Zissulescu <claziss@synopsys.com>
|
||||||
|
|
||||||
* elf32-arc.c (FEATURE_LIST_NAME): Define.
|
* elf32-arc.c (FEATURE_LIST_NAME): Define.
|
||||||
|
@ -5974,6 +5974,7 @@ elf_x86_64_finish_dynamic_symbol (bfd *output_bfd,
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
asection *plt;
|
asection *plt;
|
||||||
|
bfd_vma plt_offset;
|
||||||
|
|
||||||
if (!h->pointer_equality_needed)
|
if (!h->pointer_equality_needed)
|
||||||
abort ();
|
abort ();
|
||||||
@ -5981,10 +5982,19 @@ elf_x86_64_finish_dynamic_symbol (bfd *output_bfd,
|
|||||||
/* For non-shared object, we can't use .got.plt, which
|
/* For non-shared object, we can't use .got.plt, which
|
||||||
contains the real function addres if we need pointer
|
contains the real function addres if we need pointer
|
||||||
equality. We load the GOT entry with the PLT entry. */
|
equality. We load the GOT entry with the PLT entry. */
|
||||||
|
if (htab->plt_bnd != NULL)
|
||||||
|
{
|
||||||
|
plt = htab->plt_bnd;
|
||||||
|
plt_offset = eh->plt_bnd.offset;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
plt = htab->elf.splt ? htab->elf.splt : htab->elf.iplt;
|
plt = htab->elf.splt ? htab->elf.splt : htab->elf.iplt;
|
||||||
|
plt_offset = h->plt.offset;
|
||||||
|
}
|
||||||
bfd_put_64 (output_bfd, (plt->output_section->vma
|
bfd_put_64 (output_bfd, (plt->output_section->vma
|
||||||
+ plt->output_offset
|
+ plt->output_offset
|
||||||
+ h->plt.offset),
|
+ plt_offset),
|
||||||
htab->elf.sgot->contents + h->got.offset);
|
htab->elf.sgot->contents + h->got.offset);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,10 @@
|
|||||||
|
2017-05-10 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
|
PR ld/21481
|
||||||
|
* testsuite/ld-x86-64/pr21481a.c: New file.
|
||||||
|
* testsuite/ld-x86-64/pr21481b.S: Likewise.
|
||||||
|
* testsuite/ld-x86-64/x86-64.exp: Run PR ld/21481 tests.
|
||||||
|
|
||||||
2017-05-10 Claudiu Zissulescu <claziss@synopsys.com>
|
2017-05-10 Claudiu Zissulescu <claziss@synopsys.com>
|
||||||
|
|
||||||
* testsuite/ld-arc/attr-merge-0.d: New file.
|
* testsuite/ld-arc/attr-merge-0.d: New file.
|
||||||
|
8
ld/testsuite/ld-x86-64/pr21481a.c
Normal file
8
ld/testsuite/ld-x86-64/pr21481a.c
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
extern void check (void);
|
||||||
|
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
check ();
|
||||||
|
return 0;
|
||||||
|
}
|
56
ld/testsuite/ld-x86-64/pr21481b.S
Normal file
56
ld/testsuite/ld-x86-64/pr21481b.S
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
.section .rodata.str1.1,"aMS",@progbits,1
|
||||||
|
.LC0:
|
||||||
|
.string "PASS"
|
||||||
|
.text
|
||||||
|
.globl check
|
||||||
|
.type check, @function
|
||||||
|
check:
|
||||||
|
subq $8, %rsp
|
||||||
|
call *get_func1@GOTPCREL(%rip)
|
||||||
|
cmpl $func1, %eax
|
||||||
|
jne .L3
|
||||||
|
movq func1_p@GOTPCREL(%rip), %rdx
|
||||||
|
cmpq %rax, (%rdx)
|
||||||
|
jne .L3
|
||||||
|
call *func1@GOTPCREL(%rip)
|
||||||
|
cmpl $1, %eax
|
||||||
|
jne .L3
|
||||||
|
call *call_func1@GOTPCREL(%rip)
|
||||||
|
cmpl $1, %eax
|
||||||
|
jne .L3
|
||||||
|
leaq .LC0(%rip), %rdi
|
||||||
|
addq $8, %rsp
|
||||||
|
jmp *puts@GOTPCREL(%rip)
|
||||||
|
.L3:
|
||||||
|
call *abort@GOTPCREL(%rip)
|
||||||
|
.size check, .-check
|
||||||
|
.globl get_func1
|
||||||
|
.type get_func1, @function
|
||||||
|
get_func1:
|
||||||
|
movq func1@GOTPCREL(%rip), %rax
|
||||||
|
ret
|
||||||
|
.size get_func1, .-get_func1
|
||||||
|
.globl call_func1
|
||||||
|
.type call_func1, @function
|
||||||
|
call_func1:
|
||||||
|
jmp *func1@GOTPCREL(%rip)
|
||||||
|
.size call_func1, .-call_func1
|
||||||
|
.globl func1_p
|
||||||
|
.section .rodata,"a",@progbits
|
||||||
|
.align 8
|
||||||
|
.size func1_p, 8
|
||||||
|
.type func1_p, @object
|
||||||
|
func1_p:
|
||||||
|
.dc.a func1
|
||||||
|
.text
|
||||||
|
implementation1:
|
||||||
|
movl $1, %eax
|
||||||
|
ret
|
||||||
|
.size implementation1, .-implementation1
|
||||||
|
.globl func1
|
||||||
|
.type func1, @gnu_indirect_function
|
||||||
|
func1:
|
||||||
|
leaq implementation1(%rip), %rax
|
||||||
|
ret
|
||||||
|
.size func1, .-func1
|
||||||
|
.section .note.GNU-stack,"",@progbits
|
@ -1316,6 +1316,24 @@ if { [isnative] && [which $CC] != 0 } {
|
|||||||
"pr20800" \
|
"pr20800" \
|
||||||
"pass.out" \
|
"pass.out" \
|
||||||
] \
|
] \
|
||||||
|
[list \
|
||||||
|
"Run pr21481a" \
|
||||||
|
"$NOPIE_LDFLAGS -Wl,-z,bndplt" \
|
||||||
|
"" \
|
||||||
|
{ pr21481a.c pr21481b.S } \
|
||||||
|
"pr21481a" \
|
||||||
|
"pass.out" \
|
||||||
|
"$NOPIE_CFLAGS" \
|
||||||
|
] \
|
||||||
|
[list \
|
||||||
|
"Run pr21481b" \
|
||||||
|
"$NOPIE_LDFLAGS -Wl,-z,bndplt,-z,now" \
|
||||||
|
"" \
|
||||||
|
{ pr21481a.c pr21481b.S } \
|
||||||
|
"pr21481b" \
|
||||||
|
"pass.out" \
|
||||||
|
"$NOPIE_CFLAGS" \
|
||||||
|
] \
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user