[uClibc-cvs] uClibc/utils ldd.c,1.3,1.4

Erik Andersen andersen at uclibc.org
Sun Feb 1 11:10:34 UTC 2004


Update of /var/cvs/uClibc/utils
In directory nail:/tmp/cvs-serv4963

Modified Files:
	ldd.c 
Log Message:
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.


Index: ldd.c
===================================================================
RCS file: /var/cvs/uClibc/utils/ldd.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- ldd.c	23 Nov 2003 18:46:00 -0000	1.3
+++ ldd.c	1 Feb 2004 11:10:32 -0000	1.4
@@ -181,6 +181,20 @@
 	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 @@
 	 * 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 @@
 	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 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 @@
 	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;




More information about the uClibc-cvs mailing list