diff options
Diffstat (limited to 'ld/testsuite')
-rw-r--r-- | ld/testsuite/ld-x86-64/gprel-1a.S | 15 | ||||
-rw-r--r-- | ld/testsuite/ld-x86-64/gprel-1b.c | 32 | ||||
-rw-r--r-- | ld/testsuite/ld-x86-64/gprel-2a.S | 14 | ||||
-rw-r--r-- | ld/testsuite/ld-x86-64/gprel-2b.c | 30 | ||||
-rw-r--r-- | ld/testsuite/ld-x86-64/gprel-3.d | 3 | ||||
-rw-r--r-- | ld/testsuite/ld-x86-64/gprel-3.s | 4 | ||||
-rw-r--r-- | ld/testsuite/ld-x86-64/gprel-4.d | 3 | ||||
-rw-r--r-- | ld/testsuite/ld-x86-64/gprel-4.s | 17 | ||||
-rw-r--r-- | ld/testsuite/ld-x86-64/gprel-5.d | 3 | ||||
-rw-r--r-- | ld/testsuite/ld-x86-64/gprel-5.s | 19 | ||||
-rw-r--r-- | ld/testsuite/ld-x86-64/x86-64.exp | 48 |
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" |