From f7fd19e2b83c06cf1590d2ac8d0e9fc1ea4739c2 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Tue, 10 Jan 2017 10:28:20 +1030 Subject: [PATCH] [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. --- gold/ChangeLog | 9 ++++++ gold/testsuite/copy_test_relro.cc | 45 ++++++++++++++++++++++++----- gold/testsuite/copy_test_relro_1.cc | 4 +++ gold/testsuite/ver_test_8.sh | 6 ++-- 4 files changed, 54 insertions(+), 10 deletions(-) diff --git a/gold/ChangeLog b/gold/ChangeLog index bf834f8da4e..3f1a2fce5bf 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,12 @@ +2017-01-10 Alan Modra + + * 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 * options.h: Add --secure-plt option. diff --git a/gold/testsuite/copy_test_relro.cc b/gold/testsuite/copy_test_relro.cc index effc9b46b46..0f25428196a 100644 --- a/gold/testsuite/copy_test_relro.cc +++ b/gold/testsuite/copy_test_relro.cc @@ -22,16 +22,27 @@ #include #include - -extern char* _etext; -extern char* __data_start; -extern char* _edata; -extern char* _end; +#include +#include 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(&p) < reinterpret_cast(&__data_start)); - assert(reinterpret_cast(b) < reinterpret_cast(&__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(&p) = &c; + assert(segfaults == 1); + if (sigsetjmp(jmp, 1) == 0) + *const_cast(b) = 99; + assert(segfaults == 2); + if (sigsetjmp(jmp, 1) == 0) + *const_cast(cp) = c - 1; + assert(segfaults == 3); + if (sigsetjmp(jmp, 1) == 0) + *const_cast(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 61b92ab2ee6..c5f280b476c 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 27177ab3b71..ebe4988c881 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 -- 2.30.2