// copy_test_relro.cc -- test copy relocs against read-only and relro symbols. // Copyright (C) 2016-2023 Free Software Foundation, Inc. // Written by Cary Coutant . // This file is part of gold. // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, // MA 02110-1301, USA. #include #include #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); assert(b[0] == 100); assert(b[1] == 200); assert(b[2] == 300); assert(b[3] == 400); 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; }