objtool: Support Clang non-section symbols in ORC dump
[ Upstream commit 8782e7cab51b6bf01a5a86471dd82228af1ac185 ] Historically, the relocation symbols for ORC entries have only been section symbols: .text+0: sp:sp+8 bp:(und) type:call end:0 However, the Clang assembler is aggressive about stripping section symbols. In that case we will need to use function symbols: freezing_slow_path+0: sp:sp+8 bp:(und) type:call end:0 In preparation for the generation of such entries in "objtool orc generate", add support for reading them in "objtool orc dump". Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com> Signed-off-by: Borislav Petkov <bp@suse.de> Reviewed-by: Miroslav Benes <mbenes@suse.cz> Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org> Link: https://lkml.kernel.org/r/b811b5eb1a42602c3b523576dc5efab9ad1c174d.1585761021.git.jpoimboe@redhat.com Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
820126d9a8
commit
8c627d4b15
@ -66,7 +66,7 @@ int orc_dump(const char *_objname)
|
|||||||
char *name;
|
char *name;
|
||||||
size_t nr_sections;
|
size_t nr_sections;
|
||||||
Elf64_Addr orc_ip_addr = 0;
|
Elf64_Addr orc_ip_addr = 0;
|
||||||
size_t shstrtab_idx;
|
size_t shstrtab_idx, strtab_idx = 0;
|
||||||
Elf *elf;
|
Elf *elf;
|
||||||
Elf_Scn *scn;
|
Elf_Scn *scn;
|
||||||
GElf_Shdr sh;
|
GElf_Shdr sh;
|
||||||
@ -127,6 +127,8 @@ int orc_dump(const char *_objname)
|
|||||||
|
|
||||||
if (!strcmp(name, ".symtab")) {
|
if (!strcmp(name, ".symtab")) {
|
||||||
symtab = data;
|
symtab = data;
|
||||||
|
} else if (!strcmp(name, ".strtab")) {
|
||||||
|
strtab_idx = i;
|
||||||
} else if (!strcmp(name, ".orc_unwind")) {
|
} else if (!strcmp(name, ".orc_unwind")) {
|
||||||
orc = data->d_buf;
|
orc = data->d_buf;
|
||||||
orc_size = sh.sh_size;
|
orc_size = sh.sh_size;
|
||||||
@ -138,7 +140,7 @@ int orc_dump(const char *_objname)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!symtab || !orc || !orc_ip)
|
if (!symtab || !strtab_idx || !orc || !orc_ip)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (orc_size % sizeof(*orc) != 0) {
|
if (orc_size % sizeof(*orc) != 0) {
|
||||||
@ -159,21 +161,29 @@ int orc_dump(const char *_objname)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
scn = elf_getscn(elf, sym.st_shndx);
|
if (GELF_ST_TYPE(sym.st_info) == STT_SECTION) {
|
||||||
if (!scn) {
|
scn = elf_getscn(elf, sym.st_shndx);
|
||||||
WARN_ELF("elf_getscn");
|
if (!scn) {
|
||||||
return -1;
|
WARN_ELF("elf_getscn");
|
||||||
}
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
if (!gelf_getshdr(scn, &sh)) {
|
if (!gelf_getshdr(scn, &sh)) {
|
||||||
WARN_ELF("gelf_getshdr");
|
WARN_ELF("gelf_getshdr");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
name = elf_strptr(elf, shstrtab_idx, sh.sh_name);
|
name = elf_strptr(elf, shstrtab_idx, sh.sh_name);
|
||||||
if (!name || !*name) {
|
if (!name) {
|
||||||
WARN_ELF("elf_strptr");
|
WARN_ELF("elf_strptr");
|
||||||
return -1;
|
return -1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
name = elf_strptr(elf, strtab_idx, sym.st_name);
|
||||||
|
if (!name) {
|
||||||
|
WARN_ELF("elf_strptr");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("%s+%llx:", name, (unsigned long long)rela.r_addend);
|
printf("%s+%llx:", name, (unsigned long long)rela.r_addend);
|
||||||
|
Loading…
Reference in New Issue
Block a user