lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  PHC 
Open Source and information security mailing list archives
 
Hash Suite for Android: free password hash cracker in your pocket
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Date:   Wed, 12 Aug 2020 10:57:11 -0700
From:   Kristen Carlson Accardi <kristen@...ux.intel.com>
To:     Josh Poimboeuf <jpoimboe@...hat.com>,
        Peter Zijlstra <peterz@...radead.org>
Cc:     Kristen Carlson Accardi <kristen@...ux.intel.com>,
        linux-kernel@...r.kernel.org
Subject: [PATCH] objtool: support symtab_shndx during dump

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 <kristen@...ux.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

Powered by blists - more mailing lists