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 <fabiang@radgametools.com> Signed-off-by: Cyrill Gorcunov <gorcunov@gmail.com>
This commit is contained in:
parent
f47f451a85
commit
0cb6739ba4
1 changed files with 14 additions and 3 deletions
|
@ -1574,7 +1574,7 @@ static void elf_write(void)
|
||||||
/* in case the debug information is wanted, just add these three sections... */
|
/* in case the debug information is wanted, just add these three sections... */
|
||||||
add_sectname("", ".stab");
|
add_sectname("", ".stab");
|
||||||
add_sectname("", ".stabstr");
|
add_sectname("", ".stabstr");
|
||||||
add_sectname(".rel", ".stab");
|
add_sectname(is_elf32() ? ".rel" : ".rela", ".stab");
|
||||||
} else if (dfmt_is_dwarf()) {
|
} else if (dfmt_is_dwarf()) {
|
||||||
/* the dwarf debug standard specifies the following ten sections,
|
/* the dwarf debug standard specifies the following ten sections,
|
||||||
not all of which are currently implemented,
|
not all of which are currently implemented,
|
||||||
|
@ -1737,8 +1737,13 @@ static void elf_write(void)
|
||||||
p += strlen(p) + 1;
|
p += strlen(p) + 1;
|
||||||
|
|
||||||
/* link -> symtable info -> section to refer to */
|
/* link -> symtable info -> section to refer to */
|
||||||
elf_section_header(p - shstrtab, SHT_REL, 0, stabrelbuf, false,
|
if (is_elf32()) {
|
||||||
stabrellen, sec_symtab, sec_stab, 4, is_elf64() ? 16 : 8);
|
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;
|
p += strlen(p) + 1;
|
||||||
}
|
}
|
||||||
} else if (dfmt_is_dwarf()) {
|
} else if (dfmt_is_dwarf()) {
|
||||||
|
@ -2589,11 +2594,13 @@ static void stabs_generate(void)
|
||||||
} else if (is_elfx32()) {
|
} else if (is_elfx32()) {
|
||||||
WRITELONG(rptr, (sptr - sbuf) - 4);
|
WRITELONG(rptr, (sptr - sbuf) - 4);
|
||||||
WRITELONG(rptr, ((ptr->info.section + 2) << 8) | R_X86_64_32);
|
WRITELONG(rptr, ((ptr->info.section + 2) << 8) | R_X86_64_32);
|
||||||
|
WRITELONG(rptr, 0);
|
||||||
} else {
|
} else {
|
||||||
nasm_assert(is_elf64());
|
nasm_assert(is_elf64());
|
||||||
WRITEDLONG(rptr, (int64_t)(sptr - sbuf) - 4);
|
WRITEDLONG(rptr, (int64_t)(sptr - sbuf) - 4);
|
||||||
WRITELONG(rptr, R_X86_64_32);
|
WRITELONG(rptr, R_X86_64_32);
|
||||||
WRITELONG(rptr, ptr->info.section + 2);
|
WRITELONG(rptr, ptr->info.section + 2);
|
||||||
|
WRITEDLONG(rptr, 0);
|
||||||
}
|
}
|
||||||
numstabs++;
|
numstabs++;
|
||||||
currfile = mainfileindex;
|
currfile = mainfileindex;
|
||||||
|
@ -2640,6 +2647,7 @@ static void stabs_generate(void)
|
||||||
/* relocation table entry */
|
/* relocation table entry */
|
||||||
WRITELONG(rptr, (sptr - sbuf) - 4);
|
WRITELONG(rptr, (sptr - sbuf) - 4);
|
||||||
WRITELONG(rptr, ((ptr->info.section + 2) << 8) | R_X86_64_32);
|
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);
|
WRITE_STAB(sptr, 0, N_SLINE, 0, ptr->line, ptr->info.offset);
|
||||||
|
@ -2648,6 +2656,7 @@ static void stabs_generate(void)
|
||||||
/* relocation table entry */
|
/* relocation table entry */
|
||||||
WRITELONG(rptr, (sptr - sbuf) - 4);
|
WRITELONG(rptr, (sptr - sbuf) - 4);
|
||||||
WRITELONG(rptr, ((ptr->info.section + 2) << 8) | R_X86_64_32);
|
WRITELONG(rptr, ((ptr->info.section + 2) << 8) | R_X86_64_32);
|
||||||
|
WRITELONG(rptr, ptr->info.offset);
|
||||||
|
|
||||||
ptr = ptr->next;
|
ptr = ptr->next;
|
||||||
}
|
}
|
||||||
|
@ -2668,6 +2677,7 @@ static void stabs_generate(void)
|
||||||
WRITEDLONG(rptr, (int64_t)(sptr - sbuf) - 4);
|
WRITEDLONG(rptr, (int64_t)(sptr - sbuf) - 4);
|
||||||
WRITELONG(rptr, R_X86_64_32);
|
WRITELONG(rptr, R_X86_64_32);
|
||||||
WRITELONG(rptr, ptr->info.section + 2);
|
WRITELONG(rptr, ptr->info.section + 2);
|
||||||
|
WRITEDLONG(rptr, ptr->info.offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
WRITE_STAB(sptr, 0, N_SLINE, 0, ptr->line, 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);
|
WRITEDLONG(rptr, (int64_t)(sptr - sbuf) - 4);
|
||||||
WRITELONG(rptr, R_X86_64_32);
|
WRITELONG(rptr, R_X86_64_32);
|
||||||
WRITELONG(rptr, ptr->info.section + 2);
|
WRITELONG(rptr, ptr->info.section + 2);
|
||||||
|
WRITEDLONG(rptr, ptr->info.offset);
|
||||||
|
|
||||||
ptr = ptr->next;
|
ptr = ptr->next;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue