summaryrefslogtreecommitdiff
path: root/ld/testsuite
diff options
context:
space:
mode:
Diffstat (limited to 'ld/testsuite')
-rw-r--r--ld/testsuite/ld-x86-64/gprel-1a.S15
-rw-r--r--ld/testsuite/ld-x86-64/gprel-1b.c32
-rw-r--r--ld/testsuite/ld-x86-64/gprel-2a.S14
-rw-r--r--ld/testsuite/ld-x86-64/gprel-2b.c30
-rw-r--r--ld/testsuite/ld-x86-64/gprel-3.d3
-rw-r--r--ld/testsuite/ld-x86-64/gprel-3.s4
-rw-r--r--ld/testsuite/ld-x86-64/gprel-4.d3
-rw-r--r--ld/testsuite/ld-x86-64/gprel-4.s17
-rw-r--r--ld/testsuite/ld-x86-64/gprel-5.d3
-rw-r--r--ld/testsuite/ld-x86-64/gprel-5.s19
-rw-r--r--ld/testsuite/ld-x86-64/x86-64.exp48
11 files changed, 188 insertions, 0 deletions
diff --git a/ld/testsuite/ld-x86-64/gprel-1a.S b/ld/testsuite/ld-x86-64/gprel-1a.S
new file mode 100644
index 00000000000..db099abb6a7
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/gprel-1a.S
@@ -0,0 +1,15 @@
+ .text
+ .globl get_foo
+get_foo:
+ movl %gs:foo@GPREL, %eax
+ ret
+
+ .data
+ .globl foo_gprel
+foo_gprel:
+ .long foo@GPREL
+
+ .data
+ .globl foo
+foo:
+ .long 0x12345678
diff --git a/ld/testsuite/ld-x86-64/gprel-1b.c b/ld/testsuite/ld-x86-64/gprel-1b.c
new file mode 100644
index 00000000000..97d3b553b95
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/gprel-1b.c
@@ -0,0 +1,32 @@
+#include <stdio.h>
+#include <syscall.h>
+#include <asm/prctl.h>
+
+extern int foo;
+extern int __gp;
+extern int foo_gprel;
+extern int get_foo (void);
+
+int
+setup_gp (void *p)
+{
+ int result;
+ asm volatile ("syscall"
+ : "=a" (result)
+ : "0" ((unsigned long int) SYS_arch_prctl),
+ "D" ((unsigned long int) ARCH_SET_GS),
+ "S" (p)
+ : "memory", "cc", "r11", "cx");
+ return result;
+}
+
+int
+main ()
+{
+ setup_gp (&__gp);
+ if (foo == 0x12345678
+ && *(int *) ((char *) &__gp + foo_gprel) == 0x12345678
+ && get_foo () == 0x12345678)
+ printf ("PASS\n");
+ return 0;
+}
diff --git a/ld/testsuite/ld-x86-64/gprel-2a.S b/ld/testsuite/ld-x86-64/gprel-2a.S
new file mode 100644
index 00000000000..99165e5b6a4
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/gprel-2a.S
@@ -0,0 +1,14 @@
+ .text
+ .globl get_foo
+get_foo:
+ movl %gs:foo@GPREL, %eax
+ ret
+
+ .data
+ .globl foo_gprel
+foo_gprel:
+ .long foo@GPREL
+
+ .data
+foo:
+ .long 0x12345678
diff --git a/ld/testsuite/ld-x86-64/gprel-2b.c b/ld/testsuite/ld-x86-64/gprel-2b.c
new file mode 100644
index 00000000000..3b53fad432c
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/gprel-2b.c
@@ -0,0 +1,30 @@
+#include <stdio.h>
+#include <syscall.h>
+#include <asm/prctl.h>
+
+extern int __gp;
+extern int foo_gprel;
+extern int get_foo (void);
+
+int
+setup_gp (void *p)
+{
+ int result;
+ asm volatile ("syscall"
+ : "=a" (result)
+ : "0" ((unsigned long int) SYS_arch_prctl),
+ "D" ((unsigned long int) ARCH_SET_GS),
+ "S" (p)
+ : "memory", "cc", "r11", "cx");
+ return result;
+}
+
+int
+main ()
+{
+ setup_gp (&__gp);
+ if (*(int *) ((char *) &__gp + foo_gprel) == 0x12345678
+ && get_foo () == 0x12345678)
+ printf ("PASS\n");
+ return 0;
+}
diff --git a/ld/testsuite/ld-x86-64/gprel-3.d b/ld/testsuite/ld-x86-64/gprel-3.d
new file mode 100644
index 00000000000..c870a95ad7f
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/gprel-3.d
@@ -0,0 +1,3 @@
+#as: --64
+#ld: -melf_x86_64
+#error: undefined __gp symbol
diff --git a/ld/testsuite/ld-x86-64/gprel-3.s b/ld/testsuite/ld-x86-64/gprel-3.s
new file mode 100644
index 00000000000..ba79246fda8
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/gprel-3.s
@@ -0,0 +1,4 @@
+ .text
+ .globl _start
+_start:
+ movl %gs:foo@GPREL, %eax
diff --git a/ld/testsuite/ld-x86-64/gprel-4.d b/ld/testsuite/ld-x86-64/gprel-4.d
new file mode 100644
index 00000000000..024e06634e1
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/gprel-4.d
@@ -0,0 +1,3 @@
+#as: --64
+#ld: -melf_x86_64
+#error: GPREL relocation at 0x4 in section `\.text' must be against symbol defined in GP section `\.rodata'
diff --git a/ld/testsuite/ld-x86-64/gprel-4.s b/ld/testsuite/ld-x86-64/gprel-4.s
new file mode 100644
index 00000000000..a0a89ba0cd9
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/gprel-4.s
@@ -0,0 +1,17 @@
+ .text
+ .globl _start
+_start:
+ movl %gs:foo@GPREL, %eax
+
+ .data
+ .globl bar_gprel
+bar_gprel:
+ .long bar@GPREL
+
+foo:
+ .long 0x12345678
+
+ .section .rodata,"a",@progbits
+bar:
+ .long 0x12345678
+
diff --git a/ld/testsuite/ld-x86-64/gprel-5.d b/ld/testsuite/ld-x86-64/gprel-5.d
new file mode 100644
index 00000000000..3186c346b4e
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/gprel-5.d
@@ -0,0 +1,3 @@
+#as: --64
+#ld: -melf_x86_64
+#error: symbol `bar' with GPREL relocation defined in .*\.o\(\.rodata\) isn't in GP section `\.data'
diff --git a/ld/testsuite/ld-x86-64/gprel-5.s b/ld/testsuite/ld-x86-64/gprel-5.s
new file mode 100644
index 00000000000..a49adec8dab
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/gprel-5.s
@@ -0,0 +1,19 @@
+ .text
+ .globl _start
+_start:
+ movl %gs:foo@GPREL, %eax
+
+ .data
+ .globl bar_gprel
+bar_gprel:
+ .long bar@GPREL
+
+ .globl foo
+foo:
+ .long 0x12345678
+
+ .section .rodata,"a",@progbits
+ .globl bar
+bar:
+ .long 0x12345678
+
diff --git a/ld/testsuite/ld-x86-64/x86-64.exp b/ld/testsuite/ld-x86-64/x86-64.exp
index c5825822978..8f6f0a40384 100644
--- a/ld/testsuite/ld-x86-64/x86-64.exp
+++ b/ld/testsuite/ld-x86-64/x86-64.exp
@@ -567,6 +567,9 @@ run_dump_test "pr20253-4f"
run_dump_test "pr20253-5a"
run_dump_test "pr20253-5b"
run_dump_test "tlsdesc2"
+run_dump_test "gprel-3"
+run_dump_test "gprel-4"
+run_dump_test "gprel-5"
proc undefined_weak {cflags ldflags} {
set testname "Undefined weak symbol"
@@ -1571,6 +1574,51 @@ run_ld_link_tests [list \
] \
]
+run_ld_link_exec_tests [list \
+ [list \
+ "Run GPREL 1" \
+ "" \
+ "" \
+ {gprel-1a.S gprel-1b.c} \
+ "gprel-1" "pass.out" \
+ ] \
+ [list \
+ "Run GPREL 1 (PIE)" \
+ "-pie" \
+ "" \
+ {gprel-1a.S gprel-1b.c} \
+ "gprel-1-pie" "pass.out" "-fPIE" \
+ ] \
+ [list \
+ "Run GPREL 1 (static)" \
+ "-static" \
+ "" \
+ {gprel-1a.S gprel-1b.c} \
+ "gprel-1-static" "pass.out" \
+ ] \
+ [list \
+ "Run GPREL 2" \
+ "" \
+ "" \
+ {gprel-2a.S gprel-2b.c} \
+ "gprel-2" "pass.out" \
+ ] \
+ [list \
+ "Run GPREL 2 (PIE)" \
+ "-pie" \
+ "" \
+ {gprel-2a.S gprel-2b.c} \
+ "gprel-2-pie" "pass.out" "-fPIE" \
+ ] \
+ [list \
+ "Run GPREL 2 (static)" \
+ "-static" \
+ "" \
+ {gprel-2a.S gprel-2b.c} \
+ "gprel-2-static" "pass.out" \
+ ] \
+]
+
# Linux only tests
run_dump_test "pr17618"
run_dump_test "pltgot-1"