svn commit: r240040 - head/lib/libproc

Rui Paulo rpaulo at FreeBSD.org
Sun Sep 2 18:14:02 UTC 2012


Author: rpaulo
Date: Sun Sep  2 18:14:01 2012
New Revision: 240040
URL: http://svn.freebsd.org/changeset/base/240040

Log:
  Make sure we visit both symbol sections even if one of them doesn't
  exist. This makes it possible to dtrace some C++ programs like devd.

Modified:
  head/lib/libproc/proc_sym.c

Modified: head/lib/libproc/proc_sym.c
==============================================================================
--- head/lib/libproc/proc_sym.c	Sun Sep  2 18:13:22 2012	(r240039)
+++ head/lib/libproc/proc_sym.c	Sun Sep  2 18:14:01 2012	(r240040)
@@ -254,7 +254,7 @@ proc_addr2sym(struct proc_handle *p, uin
 	 */
 	if ((data = elf_getdata(dynsymscn, NULL)) == NULL) {
 		DPRINTF("ERROR: elf_getdata() failed");
-		goto err2;
+		goto symtab;
 	}
 	i = 0;
 	while (gelf_getsym(data, i++, &sym) != NULL) {
@@ -274,11 +274,11 @@ proc_addr2sym(struct proc_handle *p, uin
 				 * the function.
 				 */
 				symcopy->st_value = rsym;
-				error = 0;
 				goto out;
 			}
 		}
 	}
+symtab:
 	/*
 	 * Iterate over the Symbols Table to find the symbol.
 	 * Then look up the string name in STRTAB (.dynstr)
@@ -430,18 +430,17 @@ proc_name2sym(struct proc_handle *p, con
 	 * Iterate over the Dynamic Symbols table to find the symbol.
 	 * Then look up the string name in STRTAB (.dynstr)
 	 */
-	if ((data = elf_getdata(dynsymscn, NULL)) == NULL) {
+	if ((data = elf_getdata(dynsymscn, NULL))) {
 		DPRINTF("ERROR: elf_getdata() failed");
-		goto err2;
-	}
-	i = 0;
-	while (gelf_getsym(data, i++, &sym) != NULL) {
-		s = elf_strptr(e, dynsymstridx, sym.st_name);
-		if (s && strcmp(s, symbol) == 0) {
-			memcpy(symcopy, &sym, sizeof(sym));
-			symcopy->st_value = map->pr_vaddr + sym.st_value;
-			error = 0;
-			goto out;
+		i = 0;
+		while (gelf_getsym(data, i++, &sym) != NULL) {
+			s = elf_strptr(e, dynsymstridx, sym.st_name);
+			if (s && strcmp(s, symbol) == 0) {
+				memcpy(symcopy, &sym, sizeof(sym));
+				symcopy->st_value = map->pr_vaddr + sym.st_value;
+				error = 0;
+				goto out;
+			}
 		}
 	}
 	/*
@@ -450,17 +449,15 @@ proc_name2sym(struct proc_handle *p, con
 	 */
 	if (symtabscn == NULL)
 		goto err2;
-	if ((data = elf_getdata(symtabscn, NULL)) == NULL) {
-		DPRINTF("ERROR: elf_getdata() failed");
-		goto err2;
-	}
-	i = 0;
-	while (gelf_getsym(data, i++, &sym) != NULL) {
-		s = elf_strptr(e, symtabstridx, sym.st_name);
-		if (s && strcmp(s, symbol) == 0) {
-			memcpy(symcopy, &sym, sizeof(sym));
-			error = 0;
-			goto out;
+	if ((data = elf_getdata(symtabscn, NULL))) {
+		i = 0;
+		while (gelf_getsym(data, i++, &sym) != NULL) {
+			s = elf_strptr(e, symtabstridx, sym.st_name);
+			if (s && strcmp(s, symbol) == 0) {
+				memcpy(symcopy, &sym, sizeof(sym));
+				error = 0;
+				goto out;
+			}
 		}
 	}
 out:


More information about the svn-src-head mailing list