Skip to content

Commit

Permalink
objtool: Support Clang non-section symbols in ORC dump
Browse files Browse the repository at this point in the history
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
  • Loading branch information
jpoimboe authored and Borislav Petkov committed Apr 14, 2020
1 parent bd841d6 commit 8782e7c
Showing 1 changed file with 27 additions and 17 deletions.
44 changes: 27 additions & 17 deletions tools/objtool/orc_dump.c
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ int orc_dump(const char *_objname)
char *name;
size_t nr_sections;
Elf64_Addr orc_ip_addr = 0;
size_t shstrtab_idx;
size_t shstrtab_idx, strtab_idx = 0;
Elf *elf;
Elf_Scn *scn;
GElf_Shdr sh;
Expand Down Expand Up @@ -127,6 +127,8 @@ int orc_dump(const char *_objname)

if (!strcmp(name, ".symtab")) {
symtab = data;
} else if (!strcmp(name, ".strtab")) {
strtab_idx = i;
} else if (!strcmp(name, ".orc_unwind")) {
orc = data->d_buf;
orc_size = sh.sh_size;
Expand All @@ -138,7 +140,7 @@ int orc_dump(const char *_objname)
}
}

if (!symtab || !orc || !orc_ip)
if (!symtab || !strtab_idx || !orc || !orc_ip)
return 0;

if (orc_size % sizeof(*orc) != 0) {
Expand All @@ -159,21 +161,29 @@ int orc_dump(const char *_objname)
return -1;
}

scn = elf_getscn(elf, sym.st_shndx);
if (!scn) {
WARN_ELF("elf_getscn");
return -1;
}

if (!gelf_getshdr(scn, &sh)) {
WARN_ELF("gelf_getshdr");
return -1;
}

name = elf_strptr(elf, shstrtab_idx, sh.sh_name);
if (!name || !*name) {
WARN_ELF("elf_strptr");
return -1;
if (GELF_ST_TYPE(sym.st_info) == STT_SECTION) {
scn = elf_getscn(elf, sym.st_shndx);
if (!scn) {
WARN_ELF("elf_getscn");
return -1;
}

if (!gelf_getshdr(scn, &sh)) {
WARN_ELF("gelf_getshdr");
return -1;
}

name = elf_strptr(elf, shstrtab_idx, sh.sh_name);
if (!name) {
WARN_ELF("elf_strptr");
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);
Expand Down

0 comments on commit 8782e7c

Please sign in to comment.