When getting the symbol index number, make sure to use the extended symbol table information in order to support symbol index's greater than 64K.
Signed-off-by: Kristen Carlson Accardi <kris...@linux.intel.com> --- tools/objtool/orc_dump.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/tools/objtool/orc_dump.c b/tools/objtool/orc_dump.c index fca46e006fc2..cf835069724a 100644 --- a/tools/objtool/orc_dump.c +++ b/tools/objtool/orc_dump.c @@ -74,7 +74,8 @@ int orc_dump(const char *_objname) GElf_Rela rela; GElf_Sym sym; Elf_Data *data, *symtab = NULL, *rela_orc_ip = NULL; - + Elf_Data *xsymtab = NULL; + Elf32_Word shndx; objname = _objname; @@ -138,6 +139,8 @@ int orc_dump(const char *_objname) orc_ip_addr = sh.sh_addr; } else if (!strcmp(name, ".rela.orc_unwind_ip")) { rela_orc_ip = data; + } else if (!strcmp(name, ".symtab_shndx")) { + xsymtab = data; } } @@ -157,13 +160,22 @@ int orc_dump(const char *_objname) return -1; } - if (!gelf_getsym(symtab, GELF_R_SYM(rela.r_info), &sym)) { - WARN_ELF("gelf_getsym"); + if (!gelf_getsymshndx(symtab, xsymtab, + GELF_R_SYM(rela.r_info), + &sym, &shndx)) { + WARN_ELF("gelf_getsymshndx"); return -1; } if (GELF_ST_TYPE(sym.st_info) == STT_SECTION) { - scn = elf_getscn(elf, sym.st_shndx); + if ((sym.st_shndx > SHN_UNDEF && + sym.st_shndx < SHN_LORESERVE) || + (xsymtab && sym.st_shndx == SHN_XINDEX)) { + if (sym.st_shndx != SHN_XINDEX) + shndx = sym.st_shndx; + } + + scn = elf_getscn(elf, shndx); if (!scn) { WARN_ELF("elf_getscn"); return -1; -- 2.20.1