From 0cb6739ba4d0bc03255ee91f57ec26d9f1de24f9 Mon Sep 17 00:00:00 2001 From: Fabian Giesen Date: Thu, 28 Jul 2016 23:41:25 -0700 Subject: [PATCH] output: elf -- Generate SHT_RELA relocs for elfx32/elf64 stabs stabs is the default debug format and GNU gold dies with an assertion failure when it encounters a SHT_REL section in an x64 ELF file. Signed-off-by: Fabian Giesen Signed-off-by: Cyrill Gorcunov --- output/outelf.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/output/outelf.c b/output/outelf.c index 15bc7514..b9075a8f 100644 --- a/output/outelf.c +++ b/output/outelf.c @@ -1574,7 +1574,7 @@ static void elf_write(void) /* in case the debug information is wanted, just add these three sections... */ add_sectname("", ".stab"); add_sectname("", ".stabstr"); - add_sectname(".rel", ".stab"); + add_sectname(is_elf32() ? ".rel" : ".rela", ".stab"); } else if (dfmt_is_dwarf()) { /* the dwarf debug standard specifies the following ten sections, not all of which are currently implemented, @@ -1737,8 +1737,13 @@ static void elf_write(void) p += strlen(p) + 1; /* link -> symtable info -> section to refer to */ - elf_section_header(p - shstrtab, SHT_REL, 0, stabrelbuf, false, - stabrellen, sec_symtab, sec_stab, 4, is_elf64() ? 16 : 8); + if (is_elf32()) { + elf_section_header(p - shstrtab, SHT_REL, 0, stabrelbuf, false, + stabrellen, sec_symtab, sec_stab, 4, 8); + } else { + elf_section_header(p - shstrtab, SHT_RELA, 0, stabrelbuf, false, + stabrellen, sec_symtab, sec_stab, 4, is_elf64() ? 24 : 12); + } p += strlen(p) + 1; } } else if (dfmt_is_dwarf()) { @@ -2589,11 +2594,13 @@ static void stabs_generate(void) } else if (is_elfx32()) { WRITELONG(rptr, (sptr - sbuf) - 4); WRITELONG(rptr, ((ptr->info.section + 2) << 8) | R_X86_64_32); + WRITELONG(rptr, 0); } else { nasm_assert(is_elf64()); WRITEDLONG(rptr, (int64_t)(sptr - sbuf) - 4); WRITELONG(rptr, R_X86_64_32); WRITELONG(rptr, ptr->info.section + 2); + WRITEDLONG(rptr, 0); } numstabs++; currfile = mainfileindex; @@ -2640,6 +2647,7 @@ static void stabs_generate(void) /* relocation table entry */ WRITELONG(rptr, (sptr - sbuf) - 4); WRITELONG(rptr, ((ptr->info.section + 2) << 8) | R_X86_64_32); + WRITELONG(rptr, ptr->info.offset); } WRITE_STAB(sptr, 0, N_SLINE, 0, ptr->line, ptr->info.offset); @@ -2648,6 +2656,7 @@ static void stabs_generate(void) /* relocation table entry */ WRITELONG(rptr, (sptr - sbuf) - 4); WRITELONG(rptr, ((ptr->info.section + 2) << 8) | R_X86_64_32); + WRITELONG(rptr, ptr->info.offset); ptr = ptr->next; } @@ -2668,6 +2677,7 @@ static void stabs_generate(void) WRITEDLONG(rptr, (int64_t)(sptr - sbuf) - 4); WRITELONG(rptr, R_X86_64_32); WRITELONG(rptr, ptr->info.section + 2); + WRITEDLONG(rptr, ptr->info.offset); } WRITE_STAB(sptr, 0, N_SLINE, 0, ptr->line, ptr->info.offset); @@ -2677,6 +2687,7 @@ static void stabs_generate(void) WRITEDLONG(rptr, (int64_t)(sptr - sbuf) - 4); WRITELONG(rptr, R_X86_64_32); WRITELONG(rptr, ptr->info.section + 2); + WRITEDLONG(rptr, ptr->info.offset); ptr = ptr->next; }