lkml.org 
[lkml]   [2020]   [May]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.9 70/80] objtool: Support Clang non-section symbols in ORC dump
    Date
    From: Josh Poimboeuf <jpoimboe@redhat.com>

    [ 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>
    ---
    tools/objtool/orc_dump.c | 44 ++++++++++++++++++++++++----------------
    1 file changed, 27 insertions(+), 17 deletions(-)

    diff --git a/tools/objtool/orc_dump.c b/tools/objtool/orc_dump.c
    index c3343820916a6..7cbbbdd932f1d 100644
    --- a/tools/objtool/orc_dump.c
    +++ b/tools/objtool/orc_dump.c
    @@ -78,7 +78,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;
    @@ -139,6 +139,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;
    @@ -150,7 +152,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) {
    @@ -171,21 +173,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);
    --
    2.20.1


    \
     
     \ /
      Last update: 2020-05-01 15:31    [W:2.334 / U:0.064 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site