diff options
author | Alan Modra <amodra@gmail.com> | 2017-01-10 10:28:20 +1030 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2017-01-10 11:50:07 +1030 |
commit | f7fd19e2b83c06cf1590d2ac8d0e9fc1ea4739c2 (patch) | |
tree | acdd999e77525edf3bc80189ee9ffa961b6a6d7a /gold | |
parent | f159cdb61155d699f5aff2a9fbad8b787a7fe10c (diff) | |
download | gdb-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.
Diffstat (limited to 'gold')
-rw-r--r-- | gold/ChangeLog | 9 | ||||
-rw-r--r-- | gold/testsuite/copy_test_relro.cc | 45 | ||||
-rw-r--r-- | gold/testsuite/copy_test_relro_1.cc | 4 | ||||
-rwxr-xr-x | gold/testsuite/ver_test_8.sh | 6 |
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 |