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:
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to