#define _GNU_SOURCE #include #include #include static void print_map (struct link_map *map) { struct link_map *tmp; for (tmp = map; tmp != 0; tmp = tmp->l_next) { printf (" 0x%lx: \"%s\"\n", tmp->l_addr, tmp->l_name?tmp->l_name:"null"); } } int main (int argc, char *argv[]) { void * handle; struct link_map *map; dlerror (); handle = dlopen (NULL, RTLD_LAZY); if (handle == NULL) { printf ("error getting handle for main binary: %s\n", dlerror ()); goto error; } if (dlinfo (handle, RTLD_DI_LINKMAP, &map) == -1) { printf ("error getting link map: %s\n", dlerror ()); goto error; } printf ("map before dlmopen\n"); print_map (map); void *module = dlmopen (LM_ID_NEWLM, "/usr/lib/libgtk-x11-2.0.so", RTLD_NOW); if (module == 0) { printf ("error=\"%s\"", dlerror ()); return; } printf ("default map after dlmopen\n"); print_map (map); if (dlinfo (module, RTLD_DI_LINKMAP, &map) == -1) { printf ("error getting 2nd link map: %s\n", dlerror ()); goto error; } printf ("2nd map after dlmopen\n"); print_map (map); return 0; error: return -1; }