aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2017-01-10 10:28:20 +1030
committerAlan Modra <amodra@gmail.com>2017-01-10 11:50:07 +1030
commitf7fd19e2b83c06cf1590d2ac8d0e9fc1ea4739c2 (patch)
treeacdd999e77525edf3bc80189ee9ffa961b6a6d7a
parentf159cdb61155d699f5aff2a9fbad8b787a7fe10c (diff)
downloadgdb-f7fd19e2b83c06cf1590d2ac8d0e9fc1ea4739c2.zip
gdb-f7fd19e2b83c06cf1590d2ac8d0e9fc1ea4739c2.tar.gz
gdb-f7fd19e2b83c06cf1590d2ac8d0e9fc1ea4739c2.tar.bz2
[GOLD] Fix tests for powerpc64
PowerPC64 defines .TOC. rather than _GLOBAL_OFFSET_TABLE_, and what's more, doesn't define it at all unless referenced. For ELFv1 ABI the symbol isn't normally referenced, so modify the test to accept .TOC. as a variant of _GLOBAL_OFFSET_TABLE_ and 0 or 1 occurrences. copy_test_relro as written doesn't need copy relocs on PowerPC64. PowerPC64 is always PIC. So, modify copy_test_relro to test that the existing vars are in fact read-only directly by deliberately causing a sigsegv, and add another couple of vars that do cause copy relocs even when PIC. * testsuite/ver_test_8.sh: Accept .TOC. in lieu of _GLOBAL_OFFSET_TABLE_. Allow zero count. * testsuite/copy_test_relro_1.cc (c, q): New vars. * testsuite/copy_test_relro.cc: Rewrite to test read-only status of variables directly. Reference new vars in read-only data.
-rw-r--r--gold/ChangeLog9
-rw-r--r--gold/testsuite/copy_test_relro.cc45
-rw-r--r--gold/testsuite/copy_test_relro_1.cc4
-rwxr-xr-xgold/testsuite/ver_test_8.sh6
4 files changed, 54 insertions, 10 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog
index bf834f8..3f1a2fc 100644
--- a/gold/ChangeLog
+++ b/gold/ChangeLog
@@ -1,5 +1,14 @@
2017-01-10 Alan Modra <amodra@gmail.com>
+ * testsuite/ver_test_8.sh: Accept .TOC. in lieu of
+ _GLOBAL_OFFSET_TABLE_. Allow zero count.
+ * testsuite/copy_test_relro_1.cc (c, q): New vars.
+ * testsuite/copy_test_relro.cc: Rewrite to test read-only
+ status of variables directly. Reference new vars in
+ read-only data.
+
+2017-01-10 Alan Modra <amodra@gmail.com>
+
* options.h: Add --secure-plt option.
* powerpc.cc (Target_powerpc::Scan::local): Detect and error
on -fPIC -mbss-plt code.
diff --git a/gold/testsuite/copy_test_relro.cc b/gold/testsuite/copy_test_relro.cc
index effc9b4..0f25428 100644
--- a/gold/testsuite/copy_test_relro.cc
+++ b/gold/testsuite/copy_test_relro.cc
@@ -22,16 +22,27 @@
#include <cassert>
#include <stdint.h>
-
-extern char* _etext;
-extern char* __data_start;
-extern char* _edata;
-extern char* _end;
+#include <signal.h>
+#include <setjmp.h>
extern int* const p;
extern const int b[];
+extern const int* const q;
+extern const int c;
int a = 123;
+extern const int* const cp __attribute__ ((section (".rodata"))) = &c;
+extern const int* const* const qp __attribute__ ((section (".rodata"))) = &q;
+
+volatile int segfaults = 0;
+sigjmp_buf jmp;
+
+void segv(int)
+{
+ ++segfaults;
+ siglongjmp(jmp, 1);
+}
+
int main()
{
assert(*p == 123);
@@ -39,7 +50,27 @@ int main()
assert(b[1] == 200);
assert(b[2] == 300);
assert(b[3] == 400);
- assert(reinterpret_cast<const void*>(&p) < reinterpret_cast<void*>(&__data_start));
- assert(reinterpret_cast<const void*>(b) < reinterpret_cast<void*>(&__data_start));
+ assert(c == 500);
+
+ struct sigaction act;
+ act.sa_handler = segv;
+ sigemptyset(&act.sa_mask);
+ act.sa_flags = 0;
+ sigaction(SIGSEGV, &act, 0);
+
+ assert(segfaults == 0);
+ if (sigsetjmp(jmp, 1) == 0)
+ *const_cast<const int **>(&p) = &c;
+ assert(segfaults == 1);
+ if (sigsetjmp(jmp, 1) == 0)
+ *const_cast<int *>(b) = 99;
+ assert(segfaults == 2);
+ if (sigsetjmp(jmp, 1) == 0)
+ *const_cast<int *>(cp) = c - 1;
+ assert(segfaults == 3);
+ if (sigsetjmp(jmp, 1) == 0)
+ *const_cast<int **>(qp) = &a;
+ assert(segfaults == 4);
+
return 0;
}
diff --git a/gold/testsuite/copy_test_relro_1.cc b/gold/testsuite/copy_test_relro_1.cc
index 61b92ab..c5f280b 100644
--- a/gold/testsuite/copy_test_relro_1.cc
+++ b/gold/testsuite/copy_test_relro_1.cc
@@ -24,3 +24,7 @@ extern int a;
extern int* const p = &a;
extern const int b[] = { 100, 200, 300, 400 };
+
+extern const int c = 500;
+
+extern const int* const q = &c;
diff --git a/gold/testsuite/ver_test_8.sh b/gold/testsuite/ver_test_8.sh
index 27177ab..ebe4988 100755
--- a/gold/testsuite/ver_test_8.sh
+++ b/gold/testsuite/ver_test_8.sh
@@ -22,10 +22,10 @@
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
# MA 02110-1301, USA.
-count=`grep -c '_GLOBAL_OFFSET_TABLE_' ver_test_8_2.so.syms`
+count=`grep -c -E '(_GLOBAL_OFFSET_TABLE_|\.TOC\.)' ver_test_8_2.so.syms`
-if test "$count" -ne 1; then
- echo "Found $count copies of '_GLOBAL_OFFSET_TABLE_' (should be only 1)"
+if test "$count" -gt 1; then
+ echo "Found $count copies of '_GLOBAL_OFFSET_TABLE_|.TOC.' (should be only 1)"
exit 1
fi