On Thu, Jan 05, 2006 at 02:49:56PM -0500, Matty wrote:
> 
> Howdy,
> 
> Does anyone on the list happen to know how info [1] gets set? I seem to 
> have hit a dead end at dladdr_core(), and have been unable to find where 
> the function pointer fct_dladdr gets assigned. Any thoughts?

Searching for RTLD_DL_SYMENT revealed:

http://cvs.opensolaris.org/source/xref/on/usr/src/cmd/sgs/rtld/common/elf.c#2967

Cheers,
- jonathan

> Thank you,
> - Ryan
> --
> UNIX Administrator
> http://daemons.net/~matty
> 
> 
> [1]
> >Howdy,
> >
> >Could someone on the list with access to the complete dladdr1() source 
> >code take a look to see how the value of info is set? When I compile and 
> >run the following code:
> >
> >$ cat dladdr.c
> >#include <stdio.h>
> >#include <dlfcn.h>
> >#include <sys/elf.h>
> >
> >static void static_func() { }
> >
> >void global_func() { }
> >
> >int main(int argc, char *argv[]) {
> >   Dl_info dlip;
> >   Elf32_Sym *info;
> >
> >   if (dladdr1(global_func, &dlip, (void **)&info, RTLD_DL_SYMENT))
> >       printf("Global: info points to symbol table entry at 0x%0x\n"
> >              "        st_value = %d, st_size = %d\n", info,
> >                       info->st_value, info->st_size);
> >
> >   if (dladdr1(static_func, &dlip, (void **)&info, RTLD_DL_SYMENT))
> >       printf("Static: info points to symbol table entry at 0x%0x\n"
> >              "        st_value = %d, st_size = %d\n", info,
> >                       info->st_value, info->st_size);
> >
> >   return(0);
> >}
> >
> >I am having trouble correlating the values from dladdr1() with the values 
> >provided by nm ( for the static function only ):
> >
> >$ ./dladdr
> >Global: info points to symbol table entry at 0x1027c
> >       st_value = 67264, st_size = 12
> >Static: info points to symbol table entry at 0x102ec
> >       st_value = 66800, st_size = 116
> >
> >$ nm dladdr | grep func
> >[84]    |     67264|      12|FUNC |GLOB |0    |9      |global_func
> >[58]    |     67252|      12|FUNC |LOCL |0    |9      |static_func
> >
> >Does anyone happen to have any insight into why this may be occuring?
> >
> >Secondly, in display_stack_info(), which is called from printstack() in 
> >libc, no attempt is made to verify that sym is not a NULL pointer
> >prior to deferencing it:
> >
> >482  if (dladdr1((void *) pc, &info, (void**) &sym,
> >           RTLD_DL_SYMENT) == 0) {
> >483          /* no info at all */
> >484          if (signo == 0)
> >485                  async_filenoprintf(filenum, "0x%x\n", pc);
> >486          else
> >487                  async_filenoprintf(filenum,
> >488                      "0x%x [ Signal %d (%s)]\n", pc,
> >489                      (ulong_t)signo, sigbuf);
> >490
> >491  } else if ((pc - (unsigned long)info.dli_saddr) <
> >492      sym->st_size) {
> >
> >This caused my segfault handler to SEGFAULT (cute isn't it), and I would 
> >like to recommend adding a check similar to the following:
> >
> >491     } else if (sym && ((pc - (unsigned long)info.dli_saddr) <
> >492                           sym->st_size)) {
> >
> >Thanks,
> >- Ryan
> >--
> >UNIX Administrator
> >http://daemons.net/~matty
> >_______________________________________________
> >opensolaris-code mailing list
> >[email protected]
> >https://opensolaris.org:444/mailman/listinfo/opensolaris-code
> _______________________________________________
> opensolaris-code mailing list
> [email protected]
> https://opensolaris.org:444/mailman/listinfo/opensolaris-code

-- 
Jonathan Adams, Solaris Kernel Development
_______________________________________________
opensolaris-code mailing list
[email protected]
https://opensolaris.org:444/mailman/listinfo/opensolaris-code

Reply via email to