浏览代码

The code for checking the rpath was not finding the rpath
value correctly, since it forgot to lookup the correct value
in the string table.

Eric Andersen 20 年之前
父节点
当前提交
dcf7d26da9
共有 1 个文件被更改,包括 20 次插入6 次删除
  1. 20 6
      utils/ldd.c

+ 20 - 6
utils/ldd.c

@@ -181,6 +181,20 @@ void * elf_find_dynamic(int const key, Elf32_Dyn *dynp,
 	return NULL;
 }
 
+static char * elf_find_rpath(Elf32_Ehdr* ehdr, Elf32_Dyn* dynamic)
+{
+	Elf32_Dyn  *dyns;
+
+	for (dyns=dynamic; byteswap32_to_host(dyns->d_tag)!=DT_NULL; ++dyns) {
+		if (DT_RPATH == byteswap32_to_host(dyns->d_tag)) {
+			char *strtab;
+			strtab = (char *)elf_find_dynamic(DT_STRTAB, dynamic, ehdr, 0);
+			return ((char*)strtab + byteswap32_to_host(dyns->d_un.d_val));
+		}
+	}
+	return NULL;
+}
+    
 int check_elf_header(Elf32_Ehdr *const ehdr)
 {
 	if (! ehdr || strncmp((void *)ehdr, ELFMAG, SELFMAG) != 0 ||  
@@ -285,7 +299,7 @@ void locate_library_file(Elf32_Ehdr* ehdr, Elf32_Dyn* dynamic, int is_suid, stru
 	 * in readelflib1.c or things won't work out as expected... */
 
 	/* The ABI specifies that RPATH is searched first, so do that now.  */
-	path = (char *)elf_find_dynamic(DT_RPATH, dynamic, ehdr, 0);
+	path = elf_find_rpath(ehdr, dynamic);
 	if (path) {
 		search_for_named_library(lib->name, buf, path);
 		if (*buf != '\0') {
@@ -401,13 +415,15 @@ static int add_library(Elf32_Ehdr* ehdr, Elf32_Dyn* dynamic, int is_setuid, char
 	return 0;
 }
 
-
-static void find_needed_libraries(Elf32_Ehdr* ehdr, Elf32_Dyn* dynamic, char *strtab, int is_setuid)
+static void find_needed_libraries(Elf32_Ehdr* ehdr, 
+		Elf32_Dyn* dynamic, int is_setuid)
 {
 	Elf32_Dyn  *dyns;
 
 	for (dyns=dynamic; byteswap32_to_host(dyns->d_tag)!=DT_NULL; ++dyns) {
 		if (DT_NEEDED == byteswap32_to_host(dyns->d_tag)) {
+			char *strtab;
+			strtab = (char *)elf_find_dynamic(DT_STRTAB, dynamic, ehdr, 0);
 			add_library(ehdr, dynamic, is_setuid, 
 					(char*)strtab + byteswap32_to_host(dyns->d_un.d_val));
 		}
@@ -482,7 +498,6 @@ int find_dependancies(char* filename)
 	int is_suid = 0;
 	FILE *thefile;
 	struct stat statbuf;
-	char *dynstr=NULL;
 	Elf32_Ehdr *ehdr = NULL;
 	Elf32_Shdr *dynsec = NULL;
 	Elf32_Dyn *dynamic = NULL;
@@ -577,8 +592,7 @@ foo:
 	dynsec = elf_find_section_type(SHT_DYNAMIC, ehdr);
 	if (dynsec) {
 		dynamic = (Elf32_Dyn*)(byteswap32_to_host(dynsec->sh_offset) + (intptr_t)ehdr);
-		dynstr = (char *)elf_find_dynamic(DT_STRTAB, dynamic, ehdr, 0);
-		find_needed_libraries(ehdr, dynamic, dynstr, is_suid);
+		find_needed_libraries(ehdr, dynamic, is_suid);
 	}
 	
 	return 0;