aboutsummaryrefslogtreecommitdiff
path: root/ld/testsuite
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2016-06-13 09:27:12 -0700
committerH.J. Lu <hjl.tools@gmail.com>2016-06-13 09:27:12 -0700
commitca8c86efe7765262e25ebb08004012ba2fdadf52 (patch)
tree552a4e2008c34cc8f907c9d0848754befd8748fa /ld/testsuite
parent97f50151221de0a023a8317559b1992a90f9cb8f (diff)
downloadgdb-ca8c86efe7765262e25ebb08004012ba2fdadf52.zip
gdb-ca8c86efe7765262e25ebb08004012ba2fdadf52.tar.gz
gdb-ca8c86efe7765262e25ebb08004012ba2fdadf52.tar.bz2
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.
Diffstat (limited to 'ld/testsuite')
-rw-r--r--ld/testsuite/ld-i386/i386.exp36
-rw-r--r--ld/testsuite/ld-i386/ifunc-1a.c8
-rw-r--r--ld/testsuite/ld-i386/ifunc-1b.S42
-rw-r--r--ld/testsuite/ld-i386/ifunc-1c.S26
-rw-r--r--ld/testsuite/ld-i386/ifunc-1d.S76
5 files changed, 188 insertions, 0 deletions
diff --git a/ld/testsuite/ld-i386/i386.exp b/ld/testsuite/ld-i386/i386.exp
index a6efa53..93f11ef 100644
--- a/ld/testsuite/ld-i386/i386.exp
+++ b/ld/testsuite/ld-i386/i386.exp
@@ -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
diff --git a/ld/testsuite/ld-i386/ifunc-1a.c b/ld/testsuite/ld-i386/ifunc-1a.c
new file mode 100644
index 0000000..370275a
--- /dev/null
+++ b/ld/testsuite/ld-i386/ifunc-1a.c
@@ -0,0 +1,8 @@
+extern void check (void);
+
+int
+main ()
+{
+ check ();
+ return 0;
+}
diff --git a/ld/testsuite/ld-i386/ifunc-1b.S b/ld/testsuite/ld-i386/ifunc-1b.S
new file mode 100644
index 0000000..802a36d
--- /dev/null
+++ b/ld/testsuite/ld-i386/ifunc-1b.S
@@ -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
diff --git a/ld/testsuite/ld-i386/ifunc-1c.S b/ld/testsuite/ld-i386/ifunc-1c.S
new file mode 100644
index 0000000..b00f128
--- /dev/null
+++ b/ld/testsuite/ld-i386/ifunc-1c.S
@@ -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
diff --git a/ld/testsuite/ld-i386/ifunc-1d.S b/ld/testsuite/ld-i386/ifunc-1d.S
new file mode 100644
index 0000000..28f262e
--- /dev/null
+++ b/ld/testsuite/ld-i386/ifunc-1d.S
@@ -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