void *dlopen(const char *pathname, int flags) { static void * (*real_dlopen)(const char *pathname, int flags) = NULL; const char *p; void *ret; /* If the value of file is 0, dlopen() shall provide a handle on a global symbol object. */ if (pathname == NULL) return real_dlopen(pathname, flags); GET_PATH(dlopen); if (p) { ret = real_dlopen(p, flags); PUT_PATH(NULL); } return real_dlopen(pathname, flags); }
void *dlopen(const char *filename, int flag) { char *msg = NULL; void *handle = NULL; print_stack(); if (real_dlopen == NULL) { dlerror(); real_dlopen = dlsym(RTLD_NEXT, "dlopen"); if ((msg = dlerror()) != NULL) { fprintf(stderr, "dlsym failed: %s\n", msg); exit(1); } fprintf(stderr, "Real dlopen at addr %p\n", real_dlopen); } handle = real_dlopen(filename, flag); if (!handle) { return NULL; } ftdm_log(FTDM_LOG_NOTICE, "Loaded %s with handle %p\n", filename, handle); return handle; }