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

Reply via email to