Ich denke, das ist ohne die Hilfe von Debuggern nicht möglich.
Vom latest glibc code, hier ist der Quellcode von dlopen
void *
dlopen (const char *file, int mode)
{
return __dlopen (file, mode, RETURN_ADDRESS (0));
}
Und __dlopen
wiederum ist definiert als
void *
__dlopen (const char *file, int mode DL_CALLER_DECL)
{
# ifdef SHARED
if (__builtin_expect (_dlfcn_hook != NULL, 0))
return _dlfcn_hook->dlopen (file, mode, DL_CALLER);
# endif
struct dlopen_args args;
args.file = file;
args.mode = mode;
args.caller = DL_CALLER;
# ifdef SHARED
return _dlerror_run (dlopen_doit, &args) ? NULL : args.new;
# else
if (_dlerror_run (dlopen_doit, &args))
return NULL;
__libc_register_dl_open_hook ((struct link_map *) args.new);
__libc_register_dlfcn_hook ((struct link_map *) args.new);
return args.new;
# endif
}
Die Flaggen der Sie suchen, RTLD_LAZY
, RTLD_NOW
, RTLD_GLOBAL
und RTLD_LOCAL
sind OR-verknüpft und in mode
Variablen gespeichert. Wie Sie sehen können, gibt es keine Route, durch die es zurückgeschickt wird oder ähnliches.
BEARBEITEN: Es scheint, es ist in der Tat ein Weg zu erreichen, was Sie wollen, wie durch die andere Antwort gezeigt. Wenn Sie meine Antwort un-nehmen, kann ich es löschen, um zukünftigen Besuchern zu helfen
+1. Nette Verwendung des Pseudo-Handles RTLD_NEXT. –