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:
Josh Poimboeuf 2020-04-01 13:23:26 -05:00 committed by Greg Kroah-Hartman
parent 820126d9a8
commit 8c627d4b15

View File

@ -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,6 +161,7 @@ int orc_dump(const char *_objname)
return -1; return -1;
} }
if (GELF_ST_TYPE(sym.st_info) == STT_SECTION) {
scn = elf_getscn(elf, sym.st_shndx); scn = elf_getscn(elf, sym.st_shndx);
if (!scn) { if (!scn) {
WARN_ELF("elf_getscn"); WARN_ELF("elf_getscn");
@ -171,10 +174,17 @@ int orc_dump(const char *_objname)
} }
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);