binutils-gdb/ld/testsuite/ld-elf/pr23428.c

47 lines
854 B
C
Raw Normal View History

/* Ensure we get syscall declared. */
#define _DEFAULT_SOURCE
x86: Add a GNU_PROPERTY_X86_ISA_1_USED note if needed When -z separate-code, which is enabled by default for Linux/x86, is used to create executable, ld won't place any data in the code-only PT_LOAD segment. If there are no data sections placed before the code-only PT_LOAD segment, the program headers won't be mapped into any PT_LOAD segment. When the executable tries to access it (based on the program header address passed in AT_PHDR), it will lead to segfault. This patch inserts a GNU_PROPERTY_X86_ISA_1_USED note if there may be no data sections before the text section so that the first PT_LOAD segment won't be code-only and will contain the program header. Testcases are adjusted to either pass "-z noseparate-code" to ld or discard the .note.gnu.property section. A Linux/x86 run-time test is added. bfd/ PR ld/23428 * elfxx-x86.c (_bfd_x86_elf_link_setup_gnu_properties): If the separate code program header is needed, make sure that the first read-only PT_LOAD segment has no code by adding a GNU_PROPERTY_X86_ISA_1_USED note. ld/ PR ld/23428 * testsuite/ld-elf/linux-x86.S: New file. * testsuite/ld-elf/linux-x86.exp: Likewise. * testsuite/ld-elf/pr23428.c: Likewise. * testsuite/ld-elf/sec64k.exp: Pass "-z noseparate-code" to ld for Linux/x86 targets. * testsuite/ld-i386/abs-iamcu.d: Likewise. * testsuite/ld-i386/abs.d: Likewise. * testsuite/ld-i386/pr12718.d: Likewise. * testsuite/ld-i386/pr12921.d: Likewise. * testsuite/ld-x86-64/abs-k1om.d: Likewise. * testsuite/ld-x86-64/abs-l1om.d: Likewise. * testsuite/ld-x86-64/abs.d: Likewise. * testsuite/ld-x86-64/pr12718.d: Likewise. * testsuite/ld-x86-64/pr12921.d: Likewise. * testsuite/ld-linkonce/zeroeh.ld: Discard .note.gnu.property section. * testsuite/ld-scripts/print-memory-usage.t: Likewise. * testsuite/ld-scripts/size-2.t: Likewise. * testsuite/lib/ld-lib.exp (run_ld_link_exec_tests): Use ld to create executable if language is "asm".
2018-07-21 00:18:47 +08:00
#include <unistd.h>
#include <link.h>
#include <syscall.h>
#define STRING_COMMA_LEN(STR) (STR), (sizeof (STR) - 1)
int
main (int argc, char **argv)
{
char **ev = &argv[argc + 1];
char **evp = ev;
ElfW(auxv_t) *av;
const ElfW(Phdr) *phdr = NULL;
size_t phnum = 0;
size_t loadnum = 0;
int fd = STDOUT_FILENO;
size_t i;
while (*evp++ != NULL)
;
av = (ElfW(auxv_t) *) evp;
for (; av->a_type != AT_NULL; ++av)
switch (av->a_type)
{
case AT_PHDR:
phdr = (const void *) av->a_un.a_val;
break;
case AT_PHNUM:
phnum = av->a_un.a_val;
break;
}
for (i = 0; i < phnum; i++, phdr++)
if (phdr->p_type == PT_LOAD)
loadnum++;
syscall (SYS_write, fd, STRING_COMMA_LEN ("PASS\n"));
syscall (SYS_exit, !loadnum);
return 0;
}