2012-11-12 13 views
5

Jetzt habe ich drei gemeinsame Objekte, A.so, B.so, C.soWie RTLD_DEEPBIND verwenden, wenn implizit aufgerufen wird?

A.c  
    void libA() 
    { 
     common(); 
    } 

    B.c 
    void common() 
    { 
     printf("COME HERE B\n"); 
    } 

    C.c 
    void common() 
    {  
     printf("COME HERE C\n"); 
    } 
    (just ingore the .h files) 

    test.c 
    int main() 
    { 
     libA();  
     return 1; 
    } 

complie: 
gcc -fPIC -shared libB.so libB.c 
gcc -fPIC -shared libA.so libA.c ./libB.so 
gcc -o test test.c libC.so libA.so 

I Ergebnis sein wollen "HIER B KOMM", und ich dlopen mit RTLD_DEEPBIND Flagge,
aber es verwenden könnte kostet zu viel Zeit, um in meinem Projekt Funktionen vom impliziten Aufruf zum expliziten Aufruf zu ändern.
Gibt es trotzdem dieses Problem zu lösen?

gcc -Wl,-Bsymbolic funktioniert nicht in dieser Lösung.

Nun, wenn A.c Implementierung von Common enthält. Es funktioniert.

Antwort

1

Es sieht so aus, als wenn der dynamische Linker in Runtime nach einem Symbol sucht, wählt er den ersten, auf den er stößt. Die Suchreihenfolge hängt von der Reihenfolge der Bibliotheken im Bereich DT_NEEDED der Binärdatei ab, die wiederum von der genauen Reihenfolge der Bibliotheken in der Befehlszeile während der Kompilierung abhängt. Stellen Sie also sicher, dass libB.so vor libC.so in der Befehlszeile beim Kompilieren test.c ist.

Verwandte Themen