2012-03-26 5 views
1

Ich bin in einem gemeinsamen Objekt (Code) mit Dlopen geladen. Ich möchte die Flags kennen, die dem Ladeaufruf zugewiesen wurden. Ich habe keinen Zugriff auf den Lader (Code) - z. Es kann ein Skript-Interpreter sein - aber ich muss nachfolgende dlopen-Aufrufe mit den gleichen Flags erstellen.Zugriff dlopen Flags

Wie kann ich das tun?

Antwort

0

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

3

Sie konnten die folgende Bibliothek anstelle eines Debugger verwenden:

#define _GNU_SOURCE 
#include <dlfcn.h> 
#include <stdio.h> 

typedef void *(*orig_dlopen_type)(const char *file, int mode); 

void *dlopen(const char *file, int mode) 
{ 
    fprintf(stderr, "dlopen called (mode: %d) on %s\n", mode, file); 
    orig_dlopen_type orig_dlopen; 
    orig_dlopen = (orig_dlopen_type)dlsym(RTLD_NEXT, "dlopen"); 
    return orig_dlopen(file, mode); 
} 

Compile mit gcc -shared -fPIC dlopen_trace.c -o dlopen_trace.so -ldl

Dann Führen Sie Ihr Programm wie gewohnt mit LD_PRELOAD=dlopen_trace.so aus. Sie sollten eine Debug-Zeile jedes Mal gedruckt werden, dlopen aufgerufen wird.

Wenn Sie möchten, können Sie auch die Flags En-Route ändern ...

+0

+1. Nette Verwendung des Pseudo-Handles RTLD_NEXT. –