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
