#if 0 *** dlinfo.c *** gets information about a shared symbol usage: $0 #endif #include #include void usage(); int main(argc, argv) int argc; char **argv; { unsigned int n = 0; void (*func)(); Dl_info dlinfo; if (argc < 2) { usage(argv[0]); } dlerror(); while (++n < argc) { char *symname = argv[n]; if (!(func = dlsym (RTLD_NEXT, symname))) { char *errstr = dlerror(); if (errstr) { fprintf (stderr, "... %s\n\n", errstr); fflush (stderr); continue; } } if (!(dladdr (func, &dlinfo))) { fprintf (stderr, "... %s: dlsym() found symbol, but" " does not exist\n\n", symname); fflush (stderr); continue; } fprintf (stdout, "*** %s ***\n" "object name: %s\n" "load address: %p\n" "nearest symbol: %s\n" "symbol value: %p\n\n", symname, dlinfo.dli_fname, dlinfo.dli_fbase, dlinfo.dli_sname, dlinfo.dli_saddr); fflush (stdout); } return (0); } void usage(name) char *name; { fprintf (stderr, "usage: %s [...]\n", name); _exit(1); }