Note that there are some explanatory texts on larger screens.

plurals
  1. POdladdr doesnt return the function name
    text
    copied!<p>I'm trying to use dladdr. It correctly locates the library, but it does not find the function name. I can call objdump, do a little math, and get the address of the function that I pass dladdr. If objdump can see it, why can't dladdr?</p> <p>Here is my function:</p> <pre><code>const char *FuncName(const void *pFunc) { Dl_info DlInfo; int nRet; // Lookup the name of the function given the function pointer if ((nRet = dladdr(pFunc, &amp;DlInfo)) != 0) return DlInfo.dli_sname; return NULL; } </code></pre> <p>Here is a gdb transcript showing what I get.</p> <pre><code>Program received signal SIGINT, Interrupt. [Switching to Thread 0xf7f4c6c0 (LWP 28365)] 0xffffe410 in __kernel_vsyscall () (gdb) p MatchRec8Cmp $2 = {void (TCmp *, TWork *, TThread *)} 0xf1b62e73 &lt;MatchRec8Cmp&gt; (gdb) call FuncName(MatchRec8Cmp) $3 = 0x0 (gdb) call FuncName(0xf1b62e73) $4 = 0x0 (gdb) b FuncName Breakpoint 1 at 0xf44bdddb: file threads.c, line 3420. (gdb) call FuncName(MatchRec8Cmp) Breakpoint 1, FuncName (pFunc=0xf1b62e73) at threads.c:3420 3420 { The program being debugged stopped while in a function called from GDB. When the function (FuncName) is done executing, GDB will silently stop (instead of continuing to evaluate the expression containing the function call). (gdb) s 3426 if ((nRet = dladdr(pFunc, &amp;DlInfo)) != 0) (gdb) 3427 return DlInfo.dli_sname; (gdb) p DlInfo $5 = {dli_fname = 0x8302e08 "/xxx/libdata.so", dli_fbase = 0xf1a43000, dli_sname = 0x0, dli_saddr = 0x0} (gdb) p nRet $6 = 1 (gdb) p MatchRec8Cmp - 0xf1a43000 $7 = (void (*)(TCmp *, TWork *, TThread *)) 0x11fe73 (gdb) q The program is running. Exit anyway? (y or n) y </code></pre> <p>Here is what I get from objdmp</p> <pre><code>$ objdump --syms /xxx/libdata.so | grep MatchRec8Cmp 0011fe73 l F .text 00000a98 MatchRec8Cmp </code></pre> <p>Sure enough, 0011fe73 = MatchRec8Cmp - 0xf1a43000. Anyone know why dladdr can't return dli_sname = "MatchRec8Cmp" ???</p> <p>I'm running Red Hat Enterprise Linux Server release 5.4 (Tikanga). I have seen this work before. Maybe it's my compile switches:</p> <pre><code>CFLAGS = -m32 -march=i686 -msse3 -ggdb3 -pipe -fno-common -fomit-frame-pointer \ -Ispio -fms-extensions -Wmissing-declarations -Wstrict-prototypes -Wunused -Wall \ -Wno-multichar -Wdisabled-optimization -Wmissing-prototypes -Wnested-externs \ -Wpointer-arith -Wextra -Wno-sign-compare -Wno-sequence-point \ -I../../../include -I/usr/local/include -fPIC \ -D$(Uname) -D_REENTRANT -D_GNU_SOURCE </code></pre> <p>I have tried it with -g instead of -ggdb3 although I don't think debugging symbols have anything to do with elf.</p> <p>Thanks!</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload