mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-21 01:12:32 +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:
parent
97f5015122
commit
ca8c86efe7
@ -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>
|
||||
|
||||
* elf32-mips.c (elf_mips_gnu_pcrel32): Update comment.
|
||||
|
@ -4032,21 +4032,16 @@ elf_i386_relocate_section (bfd *output_bfd,
|
||||
}
|
||||
|
||||
relocation = off;
|
||||
|
||||
/* Adjust for static executables. */
|
||||
if (htab->elf.splt == NULL)
|
||||
relocation += gotplt->output_offset;
|
||||
}
|
||||
else
|
||||
{
|
||||
relocation = (base_got->output_section->vma
|
||||
+ base_got->output_offset + off
|
||||
- gotplt->output_section->vma
|
||||
- gotplt->output_offset);
|
||||
/* Adjust for static executables. */
|
||||
if (htab->elf.splt == NULL)
|
||||
relocation += gotplt->output_offset;
|
||||
}
|
||||
relocation = (base_got->output_section->vma
|
||||
+ base_got->output_offset + off
|
||||
- gotplt->output_section->vma
|
||||
- gotplt->output_offset);
|
||||
|
||||
/* Adjust for static executables. */
|
||||
if (htab->elf.splt == NULL)
|
||||
relocation += gotplt->output_offset;
|
||||
|
||||
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>
|
||||
|
||||
* 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"
|
||||
}
|
||||
|
||||
# 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*"]
|
||||
|| [istarget "x86_64-*-linux*"]) } {
|
||||
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
|
Loading…
Reference in New Issue
Block a user