[GOLD] Fix tests for powerpc64
authorAlan Modra <amodra@gmail.com>
Mon, 9 Jan 2017 23:58:20 +0000 (10:28 +1030)
committerAlan Modra <amodra@gmail.com>
Tue, 10 Jan 2017 01:20:07 +0000 (11:50 +1030)
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
gold/testsuite/copy_test_relro.cc
gold/testsuite/copy_test_relro_1.cc
gold/testsuite/ver_test_8.sh

index bf834f8da4e511cce2dde96ea038db4f244d1a1e..3f1a2fce5bfc1b38943f38017d9a011eb3e51ea8 100644 (file)
@@ -1,3 +1,12 @@
+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.
index effc9b46b46fe5a92655e9e5c3f1b9b31a2ff6ea..0f25428196af65b539d4fc17dc01fba754c28dd8 100644 (file)
 
 #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;
 }
index 61b92ab2ee6ec17f988c2526485fc59a2a7a6418..c5f280b476c11ba7362d8545ac710a925c4b78c6 100644 (file)
@@ -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;
index 27177ab3b7171709fdf522acff3ba0c7173152ff..ebe4988c88188a620c6966e02d4d7b9dedc32f4d 100755 (executable)
 # 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