title: How to map function address to function in *.so files
body: <p>backtrace function give set of backtrace how to map it with function name/file name/line number?</p>
  
  <pre><code>for ex:-
  backtrace() returned 8 addresses
  ./libtst.so(myfunc5+0x2b) [0xb7767767]
  ./libtst.so(fun4+0x4a) [0xb7767831]
  ./libtst.so(fun3+0x48) [0xb776787f]
  ./libtst.so(fun2+0x35) [0xb77678ba]
  ./libtst.so(fun1+0x35) [0xb77678f5]
  ./a.out() [0x80485b9]
  /lib/libc.so.6(__libc_start_main+0xe5) [0xb75e9be5]
  ./a.out() [0x80484f1]
  </code></pre>
  
  <p>From the above stack how can I get the file name and line number?
  I did following things, but no luck. Correct me if I am wrong :)</p>
  
  <pre><code>for ex:-
  ./libtst.so(fun2+0x35) [0xb77dc887]
  
  0xb77dc887(fun2 addr+offset)-0xb77b6000 (lib starting addr) = 0x26887 (result)
  result is no way related to function in nm output.
  
  I used addr2line command:-
  addr2line -f -e libtst.so 0xb77dc887
  ??
  ??:0
  </code></pre>
  
  <p>So, how can I resolve either at runtime or post runtime?
  Thanks in advance...</p>
  
  <pre><code>nm:-
  00000574 T _init
  00000680 t __do_global_dtors_aux
  00000700 t frame_dummy
  00000737 t __i686.get_pc_thunk.bx
  0000073c T myfunc5
  000007e7 T fun4
  00000837 T fun3
  00000885 T fun2
  000008c0 T fun1
  00000900 t __do_global_ctors_aux
  00000938 T _fini
  000009b4 r __FRAME_END__
  00001efc d __CTOR_LIST__
  00001f00 d __CTOR_END__
  00001f04 d __DTOR_LIST__
  00001f08 d __DTOR_END__
  00001f0c d __JCR_END__
  00001f0c d __JCR_LIST__
  00001f10 a _DYNAMIC
  00001ff4 a _GLOBAL_OFFSET_TABLE_
  00002030 d __dso_handle
  00002034 A __bss_start
  00002034 A _edata
  00002034 b completed.5773
  00002038 b dtor_idx.5775
  0000203c B funptr
  00002040 A _end
       U backtrace@@GLIBC_2.1
       U backtrace_symbols@@GLIBC_2.1
       U free@@GLIBC_2.0
       U __isoc99_scanf@@GLIBC_2.7
       U perror@@GLIBC_2.0
       U printf@@GLIBC_2.0
       U puts@@GLIBC_2.0
       w __cxa_finalize@@GLIBC_2.1.3
       w __gmon_start__
       w _Jv_RegisterClasses
  
  pmap:-
  START       SIZE     RSS     PSS   DIRTY    SWAP PERM MAPPING
  08048000      4K      4K      4K      0K      0K r-xp /home/test/libtofun/a.out
  08049000      4K      4K      4K      4K      0K r--p /home/test/libtofun/a.out
  0804a000      4K      4K      4K      4K      0K rw-p /home/test/libtofun/a.out
  ...
  b7767000      4K      4K      4K      0K      0K r-xp /home/test/libtofun/libtst.so
  b7768000      4K      4K      4K      4K      0K r--p /home/test/libtofun/libtst.so
  b7769000      4K      4K      4K      4K      0K rw-p /home/test/libtofun/libtst.so
  ....
  Total:     1688K    376K     82K     72K      0K
  </code></pre>
  
  <p>128K writable-private, 1560K readonly-private, 0K shared, and 376K referenced</p>
  
  <pre><code>libtst.c:-
  
  void myfunc5(void){
  int j, nptrs;
  #define SIZE 100
  void *buffer[100];
  char **strings;
  
  nptrs = backtrace(buffer, SIZE);
  printf("backtrace() returned %d addresses\n", nptrs);
  
  strings = backtrace_symbols(buffer, nptrs);
  if (strings == NULL) {
      perror("backtrace_symbols");
  }
  
  for (j = 0; j &lt; nptrs; j++)
      printf("%s\n", strings[j]);
  
  free(strings);
  }
  
  void fun4(){
  char ip;
  char *fun = "fun4\0";
  printf("Fun name %s\n",fun);
  scanf("%c",&amp;ip);
  myfunc5();
  }
  
  
  void fun3(){
  char *fun = "fun3\0";
  printf("Fun name %s\n",fun);
  funptr = fun4;
  funptr();
  }
  
  
  void fun2(){
  char *fun = "fun2\0";
  printf("Fun name %s\n",fun);
  fun3();
  }
  
  
  void fun1(){
  char *fun = "fun1\0";
  printf("Fun name %s\n",fun);
  fun2();
  }
  
  main.c:-
  
  int main(){
  char ip;
  funptr = &amp;fun1;
  scanf("%c",&amp;ip);
  funptr();
  return 0;
  }
  </code></pre>
  
  <p>Let me know if need more information...</p>