title: dladdr doesn't return the function name
body: <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 &quot;/xxx/libdata.so&quot;, 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 = &quot;MatchRec8Cmp&quot; ???</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>