2012-11-12 20 views
5

Ora ho 3 oggetti condivisi, A.so, B.so, c.soCome utilizzare RTLD_DEEPBIND quando si richiama implicitamente?

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 

Vorrei risultato di essere "Vieni qui B" e potrei usare dlopen con RTLD_DEEPBIND di bandiera,
ma esso costa troppo tempo per cambiare le funzioni dalla chiamata implicita alla chiamata esplicita nel mio progetto.
Esiste comunque una soluzione per risolvere questo problema?

gcc -Wl,-Bsymbolic non funziona in questa soluzione.

Bene, se A.c contiene implementazione di comune. Funziona.

risposta

1

Sembra che quando il linker dinamico cerca un simbolo in runtime, sceglie il primo che incontra. L'ordine di ricerca dipende dall'ordine delle librerie nella sezione DT_NEEDED del file binario, che a sua volta dipende dall'ordine esatto delle librerie nella riga di comando durante la compilazione. Quindi, assicurati che libB.so sia precedente alla libC.so sulla riga di comando durante la compilazione di test.c.