[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.
This commit is contained in:
parent
f159cdb611
commit
f7fd19e2b8
@ -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.
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user