aboutsummaryrefslogtreecommitdiff
path: root/ld/testsuite
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2015-04-10 14:02:23 -0700
committerH.J. Lu <hjl.tools@gmail.com>2015-04-10 14:02:23 -0700
commit3d9499950a94df8577fa01ba98ec0d58f07fd9c0 (patch)
tree4ec8ffff58a0fa7867665e53f261b04d9cc4d9c0 /ld/testsuite
parent9ee417720b2f25c56a9738569b63f686cbc8584f (diff)
downloadbinutils-3d9499950a94df8577fa01ba98ec0d58f07fd9c0.zip
binutils-3d9499950a94df8577fa01ba98ec0d58f07fd9c0.tar.gz
binutils-3d9499950a94df8577fa01ba98ec0d58f07fd9c0.tar.bz2
Check GOTOFF reloc against protected data on x86
R_386_GOTOFF/R_X86_64_GOTOFF64 relocation shouldn't be used against protected data symbol on x86 since with copy relocation, address of protected data defined in the shared library may be external. This patch will break building shared libraries with protected data symbols using GCCs older than GCC 5 without the bug fix for https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65248 GCC backport request should be made in the GCC bug report above. bfd/ PR ld/pr17709 * elf32-i386.c (elf_i386_relocate_section): Also check R_386_GOTOFF against protected data symbol when building shared library. * elf64-x86-64.c (elf_x86_64_relocate_section): Also check R_X86_64_GOTOFF64 against protected data symbol when building shared library. ld/testsuite/ PR ld/pr17709 * ld-i386/protected6.d: New file. * ld-i386/protected6.s: Likewise. * ld-x86-64/protected6.d: Likewise. * ld-x86-64/protected6.s: Likewise. * ld-x86-64/protected7.d: Likewise. * ld-x86-64/protected7.s: Likewise. * ld-x86-64/protected7a.d: Likewise. * ld-x86-64/protected7b.d: Likewise.
Diffstat (limited to 'ld/testsuite')
-rw-r--r--ld/testsuite/ChangeLog12
-rw-r--r--ld/testsuite/ld-i386/i386.exp1
-rw-r--r--ld/testsuite/ld-i386/protected6.d3
-rw-r--r--ld/testsuite/ld-i386/protected6.s14
-rw-r--r--ld/testsuite/ld-x86-64/protected6.d3
-rw-r--r--ld/testsuite/ld-x86-64/protected6.s14
-rw-r--r--ld/testsuite/ld-x86-64/protected7.s12
-rw-r--r--ld/testsuite/ld-x86-64/protected7a.d4
-rw-r--r--ld/testsuite/ld-x86-64/protected7b.d6
-rw-r--r--ld/testsuite/ld-x86-64/x86-64.exp3
10 files changed, 72 insertions, 0 deletions
diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog
index 170ad04..c4bc387 100644
--- a/ld/testsuite/ChangeLog
+++ b/ld/testsuite/ChangeLog
@@ -1,5 +1,17 @@
2015-04-10 H.J. Lu <hongjiu.lu@intel.com>
+ PR ld/pr17709
+ * ld-i386/protected6.d: New file.
+ * ld-i386/protected6.s: Likewise.
+ * ld-x86-64/protected6.d: Likewise.
+ * ld-x86-64/protected6.s: Likewise.
+ * ld-x86-64/protected7.d: Likewise.
+ * ld-x86-64/protected7.s: Likewise.
+ * ld-x86-64/protected7a.d: Likewise.
+ * ld-x86-64/protected7b.d: Likewise.
+
+2015-04-10 H.J. Lu <hongjiu.lu@intel.com>
+
PR ld/pr15228
PR ld/pr17709
* ld-i386/i386.exp (i386tests): Add a test for PR ld/17709.
diff --git a/ld/testsuite/ld-i386/i386.exp b/ld/testsuite/ld-i386/i386.exp
index 3fdd39c..3dd1139 100644
--- a/ld/testsuite/ld-i386/i386.exp
+++ b/ld/testsuite/ld-i386/i386.exp
@@ -236,6 +236,7 @@ run_dump_test "protected2"
run_dump_test "protected3"
run_dump_test "protected4"
run_dump_test "protected5"
+run_dump_test "protected6"
run_dump_test "tlspie1"
run_dump_test "tlspie2"
run_dump_test "nogot1"
diff --git a/ld/testsuite/ld-i386/protected6.d b/ld/testsuite/ld-i386/protected6.d
new file mode 100644
index 0000000..37d5132
--- /dev/null
+++ b/ld/testsuite/ld-i386/protected6.d
@@ -0,0 +1,3 @@
+#as: --32
+#ld: -shared -melf_i386
+#error: .*relocation R_386_GOTOFF against protected data `foo' can not be used when making a shared object
diff --git a/ld/testsuite/ld-i386/protected6.s b/ld/testsuite/ld-i386/protected6.s
new file mode 100644
index 0000000..f57900e
--- /dev/null
+++ b/ld/testsuite/ld-i386/protected6.s
@@ -0,0 +1,14 @@
+ .data
+ .protected foo
+ .globl foo
+ .align 4
+ .type foo, @object
+ .size foo, 4
+foo:
+ .long 1
+ .text
+ .globl bar
+ .type bar, @function
+bar:
+ movl foo@GOTOFF(%ecx), %eax
+ .size bar, .-bar
diff --git a/ld/testsuite/ld-x86-64/protected6.d b/ld/testsuite/ld-x86-64/protected6.d
new file mode 100644
index 0000000..872a9f6
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/protected6.d
@@ -0,0 +1,3 @@
+#as: --64
+#ld: -shared -melf_x86_64
+#error: .*relocation R_X86_64_GOTOFF64 against protected data `foo' can not be used when making a shared object
diff --git a/ld/testsuite/ld-x86-64/protected6.s b/ld/testsuite/ld-x86-64/protected6.s
new file mode 100644
index 0000000..8ac69c5
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/protected6.s
@@ -0,0 +1,14 @@
+ .protected foo
+.globl foo
+ .data
+ .align 4
+ .type foo, @object
+ .size foo, 4
+foo:
+ .long 1
+ .text
+ .globl bar
+ .type bar, @function
+bar:
+ movabsq $foo@GOTOFF, %rax
+ .size bar, .-bar
diff --git a/ld/testsuite/ld-x86-64/protected7.s b/ld/testsuite/ld-x86-64/protected7.s
new file mode 100644
index 0000000..df4765d
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/protected7.s
@@ -0,0 +1,12 @@
+ .text
+.globl foo
+ .protected foo
+ .type foo, @function
+foo:
+ ret
+ .size foo, .-foo
+.globl bar
+ .type bar, @function
+bar:
+ movabsq $foo@GOTOFF, %rax
+ .size bar, .-bar
diff --git a/ld/testsuite/ld-x86-64/protected7a.d b/ld/testsuite/ld-x86-64/protected7a.d
new file mode 100644
index 0000000..3082084
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/protected7a.d
@@ -0,0 +1,4 @@
+#source: protected7.s
+#as: --64
+#ld: -shared -melf_x86_64
+#error: .*relocation R_X86_64_GOTOFF64 against protected function `foo' can not be used when making a shared object
diff --git a/ld/testsuite/ld-x86-64/protected7b.d b/ld/testsuite/ld-x86-64/protected7b.d
new file mode 100644
index 0000000..e18026c
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/protected7b.d
@@ -0,0 +1,6 @@
+#source: protected7.s
+#as: --64
+#ld: -shared -Bsymbolic -melf_x86_64
+#readelf: -r
+
+There are no relocations in this file.
diff --git a/ld/testsuite/ld-x86-64/x86-64.exp b/ld/testsuite/ld-x86-64/x86-64.exp
index 98514ed..63754ef 100644
--- a/ld/testsuite/ld-x86-64/x86-64.exp
+++ b/ld/testsuite/ld-x86-64/x86-64.exp
@@ -218,6 +218,9 @@ run_dump_test "protected3"
run_dump_test "protected3-l1om"
run_dump_test "protected4"
run_dump_test "protected5"
+run_dump_test "protected6"
+run_dump_test "protected7a"
+run_dump_test "protected7b"
run_dump_test "tlsle1"
run_dump_test "tlspie1"
run_dump_test "unique1"