diff options
-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 |