mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-24 04:00:07 +08:00
Add 2 i386 tests to call IFUNC functions via GOT
bfd/ * elf32-i386.c (elf_i386_relocate_section): Simplify IFUNC GOT32 adjustment for static executables. ld/ 2016-06-13 H.J. Lu <hongjiu.lu@intel.com> * testsuite/ld-i386/i386.exp: Run ifunc-1a and ifunc-1b. * testsuite/ld-i386/ifunc-1a.c: New file. * testsuite/ld-i386/ifunc-1b.S: Likewise. * testsuite/ld-i386/ifunc-1c.S: Likewise. * testsuite/ld-i386/ifunc-1d.S: Likewise.
This commit is contained in:
@ -1,3 +1,8 @@
|
|||||||
|
2016-06-13 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
|
* elf32-i386.c (elf_i386_relocate_section): Simplify IFUNC
|
||||||
|
GOT32 adjustment for static executables.
|
||||||
|
|
||||||
2016-06-13 Maciej W. Rozycki <macro@imgtec.com>
|
2016-06-13 Maciej W. Rozycki <macro@imgtec.com>
|
||||||
|
|
||||||
* elf32-mips.c (elf_mips_gnu_pcrel32): Update comment.
|
* elf32-mips.c (elf_mips_gnu_pcrel32): Update comment.
|
||||||
|
@ -4032,21 +4032,16 @@ elf_i386_relocate_section (bfd *output_bfd,
|
|||||||
}
|
}
|
||||||
|
|
||||||
relocation = off;
|
relocation = off;
|
||||||
|
|
||||||
/* Adjust for static executables. */
|
|
||||||
if (htab->elf.splt == NULL)
|
|
||||||
relocation += gotplt->output_offset;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
|
||||||
relocation = (base_got->output_section->vma
|
relocation = (base_got->output_section->vma
|
||||||
+ base_got->output_offset + off
|
+ base_got->output_offset + off
|
||||||
- gotplt->output_section->vma
|
- gotplt->output_section->vma
|
||||||
- gotplt->output_offset);
|
- gotplt->output_offset);
|
||||||
|
|
||||||
/* Adjust for static executables. */
|
/* Adjust for static executables. */
|
||||||
if (htab->elf.splt == NULL)
|
if (htab->elf.splt == NULL)
|
||||||
relocation += gotplt->output_offset;
|
relocation += gotplt->output_offset;
|
||||||
}
|
|
||||||
|
|
||||||
goto do_relocation;
|
goto do_relocation;
|
||||||
|
|
||||||
|
@ -1,3 +1,11 @@
|
|||||||
|
2016-06-13 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
|
* testsuite/ld-i386/i386.exp: Run ifunc-1a and ifunc-1b.
|
||||||
|
* testsuite/ld-i386/ifunc-1a.c: New file.
|
||||||
|
* testsuite/ld-i386/ifunc-1b.S: Likewise.
|
||||||
|
* testsuite/ld-i386/ifunc-1c.S: Likewise.
|
||||||
|
* testsuite/ld-i386/ifunc-1d.S: Likewise.
|
||||||
|
|
||||||
2016-06-13 Cupertino Miranda <cmiranda@synospsy.com>
|
2016-06-13 Cupertino Miranda <cmiranda@synospsy.com>
|
||||||
|
|
||||||
* testsuite/ld-srec/srec.exp: Changed to XFAIL on both little and
|
* testsuite/ld-srec/srec.exp: Changed to XFAIL on both little and
|
||||||
|
@ -809,6 +809,42 @@ if { [isnative]
|
|||||||
undefined_weak "-fPIE" "-pie -z nodynamic-undefined-weak"
|
undefined_weak "-fPIE" "-pie -z nodynamic-undefined-weak"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Must be native with the C compiler and working IFUNC support,
|
||||||
|
if { [isnative]
|
||||||
|
&& [check_ifunc_available]
|
||||||
|
&& [istarget "i?86-*-*"]
|
||||||
|
&& [which $CC] != 0 } {
|
||||||
|
run_cc_link_tests [list \
|
||||||
|
[list \
|
||||||
|
"Build ifunc-1a.o ifunc-1b.o ifunc-1c.o ifunc-1d.o" \
|
||||||
|
"" \
|
||||||
|
"-fPIC -O2 -g" \
|
||||||
|
{ ifunc-1a.c ifunc-1b.S ifunc-1c.S ifunc-1d.S } \
|
||||||
|
] \
|
||||||
|
]
|
||||||
|
|
||||||
|
run_ld_link_exec_tests [] [list \
|
||||||
|
[list \
|
||||||
|
"Run ifunc-1a" \
|
||||||
|
"tmpdir/ifunc-1a.o tmpdir/ifunc-1b.o \
|
||||||
|
tmpdir/ifunc-1c.o tmpdir/ifunc-1d.o" \
|
||||||
|
"" \
|
||||||
|
{ dummy.c } \
|
||||||
|
"ifunc-1a" \
|
||||||
|
"pass.out" \
|
||||||
|
] \
|
||||||
|
[list \
|
||||||
|
"Run ifunc-1b" \
|
||||||
|
"--static tmpdir/ifunc-1a.o tmpdir/ifunc-1b.o \
|
||||||
|
tmpdir/ifunc-1c.o tmpdir/ifunc-1d.o" \
|
||||||
|
"" \
|
||||||
|
{ dummy.c } \
|
||||||
|
"ifunc-1b" \
|
||||||
|
"pass.out" \
|
||||||
|
] \
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
if { !([istarget "i?86-*-linux*"]
|
if { !([istarget "i?86-*-linux*"]
|
||||||
|| [istarget "x86_64-*-linux*"]) } {
|
|| [istarget "x86_64-*-linux*"]) } {
|
||||||
return
|
return
|
||||||
|
8
ld/testsuite/ld-i386/ifunc-1a.c
Normal file
8
ld/testsuite/ld-i386/ifunc-1a.c
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
extern void check (void);
|
||||||
|
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
check ();
|
||||||
|
return 0;
|
||||||
|
}
|
42
ld/testsuite/ld-i386/ifunc-1b.S
Normal file
42
ld/testsuite/ld-i386/ifunc-1b.S
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
.section .rodata.str1.1,"aMS",@progbits,1
|
||||||
|
.LC0:
|
||||||
|
.string "PASS"
|
||||||
|
.text
|
||||||
|
.p2align 4,,15
|
||||||
|
.globl check
|
||||||
|
.type check, @function
|
||||||
|
check:
|
||||||
|
pushl %ebx
|
||||||
|
call __x86.get_pc_thunk.bx
|
||||||
|
addl $_GLOBAL_OFFSET_TABLE_, %ebx
|
||||||
|
subl $8, %esp
|
||||||
|
call *get_func1@GOT(%ebx)
|
||||||
|
cmpl func1@GOT(%ebx), %eax
|
||||||
|
jne .L3
|
||||||
|
call *func1@GOT(%ebx)
|
||||||
|
cmpl $1, %eax
|
||||||
|
jne .L3
|
||||||
|
call *call_func1@GOT(%ebx)
|
||||||
|
cmpl $1, %eax
|
||||||
|
jne .L3
|
||||||
|
call *call_func2@GOT(%ebx)
|
||||||
|
cmpl $2, %eax
|
||||||
|
jne .L3
|
||||||
|
leal .LC0@GOTOFF(%ebx), %eax
|
||||||
|
subl $12, %esp
|
||||||
|
pushl %eax
|
||||||
|
call *puts@GOT(%ebx)
|
||||||
|
addl $24, %esp
|
||||||
|
popl %ebx
|
||||||
|
ret
|
||||||
|
.L3:
|
||||||
|
call *abort@GOT(%ebx)
|
||||||
|
.size check, .-check
|
||||||
|
.section .text.__x86.get_pc_thunk.bx,"axG",@progbits,__x86.get_pc_thunk.bx,comdat
|
||||||
|
.globl __x86.get_pc_thunk.bx
|
||||||
|
.hidden __x86.get_pc_thunk.bx
|
||||||
|
.type __x86.get_pc_thunk.bx, @function
|
||||||
|
__x86.get_pc_thunk.bx:
|
||||||
|
movl (%esp), %ebx
|
||||||
|
ret
|
||||||
|
.section .note.GNU-stack,"",@progbits
|
26
ld/testsuite/ld-i386/ifunc-1c.S
Normal file
26
ld/testsuite/ld-i386/ifunc-1c.S
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
.text
|
||||||
|
.p2align 4,,15
|
||||||
|
.globl get_func1
|
||||||
|
.type get_func1, @function
|
||||||
|
get_func1:
|
||||||
|
call __x86.get_pc_thunk.ax
|
||||||
|
addl $_GLOBAL_OFFSET_TABLE_, %eax
|
||||||
|
movl func1@GOT(%eax), %eax
|
||||||
|
ret
|
||||||
|
.size get_func1, .-get_func1
|
||||||
|
.p2align 4,,15
|
||||||
|
.globl call_func1
|
||||||
|
.type call_func1, @function
|
||||||
|
call_func1:
|
||||||
|
call __x86.get_pc_thunk.ax
|
||||||
|
addl $_GLOBAL_OFFSET_TABLE_, %eax
|
||||||
|
jmp *func1@GOT(%eax)
|
||||||
|
.size call_func1, .-call_func1
|
||||||
|
.section .text.__x86.get_pc_thunk.ax,"axG",@progbits,__x86.get_pc_thunk.ax,comdat
|
||||||
|
.globl __x86.get_pc_thunk.ax
|
||||||
|
.hidden __x86.get_pc_thunk.ax
|
||||||
|
.type __x86.get_pc_thunk.ax, @function
|
||||||
|
__x86.get_pc_thunk.ax:
|
||||||
|
movl (%esp), %eax
|
||||||
|
ret
|
||||||
|
.section .note.GNU-stack,"",@progbits
|
76
ld/testsuite/ld-i386/ifunc-1d.S
Normal file
76
ld/testsuite/ld-i386/ifunc-1d.S
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
.text
|
||||||
|
.p2align 4,,15
|
||||||
|
.type implementation1, @function
|
||||||
|
implementation1:
|
||||||
|
movl $1, %eax
|
||||||
|
ret
|
||||||
|
.size implementation1, .-implementation1
|
||||||
|
.p2align 4,,15
|
||||||
|
.type implementation2, @function
|
||||||
|
implementation2:
|
||||||
|
movl $2, %eax
|
||||||
|
ret
|
||||||
|
.size implementation2, .-implementation2
|
||||||
|
.p2align 4,,15
|
||||||
|
.type resolver2, @function
|
||||||
|
resolver2:
|
||||||
|
call __x86.get_pc_thunk.ax
|
||||||
|
addl $_GLOBAL_OFFSET_TABLE_, %eax
|
||||||
|
leal implementation2@GOTOFF(%eax), %eax
|
||||||
|
ret
|
||||||
|
.size resolver2, .-resolver2
|
||||||
|
.type func2, @gnu_indirect_function
|
||||||
|
.set func2,resolver2
|
||||||
|
.p2align 4,,15
|
||||||
|
.type resolver1, @function
|
||||||
|
resolver1:
|
||||||
|
call __x86.get_pc_thunk.ax
|
||||||
|
addl $_GLOBAL_OFFSET_TABLE_, %eax
|
||||||
|
leal implementation1@GOTOFF(%eax), %eax
|
||||||
|
ret
|
||||||
|
.size resolver1, .-resolver1
|
||||||
|
.globl func1
|
||||||
|
.type func1, @gnu_indirect_function
|
||||||
|
.set func1,resolver1
|
||||||
|
.p2align 4,,15
|
||||||
|
.globl get_func2
|
||||||
|
.type get_func2, @function
|
||||||
|
get_func2:
|
||||||
|
call __x86.get_pc_thunk.ax
|
||||||
|
addl $_GLOBAL_OFFSET_TABLE_, %eax
|
||||||
|
movl func2@GOT(%eax), %eax
|
||||||
|
ret
|
||||||
|
.size get_func2, .-get_func2
|
||||||
|
.p2align 4,,15
|
||||||
|
.globl call_func2
|
||||||
|
.type call_func2, @function
|
||||||
|
call_func2:
|
||||||
|
pushl %ebx
|
||||||
|
call __x86.get_pc_thunk.bx
|
||||||
|
addl $_GLOBAL_OFFSET_TABLE_, %ebx
|
||||||
|
subl $8, %esp
|
||||||
|
call *get_func2@GOT(%ebx)
|
||||||
|
cmpl func2@GOT(%ebx), %eax
|
||||||
|
jne .L10
|
||||||
|
addl $8, %esp
|
||||||
|
movl %ebx, %eax
|
||||||
|
popl %ebx
|
||||||
|
jmp *func2@GOT(%eax)
|
||||||
|
.L10:
|
||||||
|
call *abort@GOT(%ebx)
|
||||||
|
.size call_func2, .-call_func2
|
||||||
|
.section .text.__x86.get_pc_thunk.ax,"axG",@progbits,__x86.get_pc_thunk.ax,comdat
|
||||||
|
.globl __x86.get_pc_thunk.ax
|
||||||
|
.hidden __x86.get_pc_thunk.ax
|
||||||
|
.type __x86.get_pc_thunk.ax, @function
|
||||||
|
__x86.get_pc_thunk.ax:
|
||||||
|
movl (%esp), %eax
|
||||||
|
ret
|
||||||
|
.section .text.__x86.get_pc_thunk.bx,"axG",@progbits,__x86.get_pc_thunk.bx,comdat
|
||||||
|
.globl __x86.get_pc_thunk.bx
|
||||||
|
.hidden __x86.get_pc_thunk.bx
|
||||||
|
.type __x86.get_pc_thunk.bx, @function
|
||||||
|
__x86.get_pc_thunk.bx:
|
||||||
|
movl (%esp), %ebx
|
||||||
|
ret
|
||||||
|
.section .note.GNU-stack,"",@progbits
|
Reference in New Issue
Block a user