2011-11-14 3 views
6

Quando si utilizza gcc per creare una libreria condivisa, è possibile limitare la visibilità dei simboli usando -fvisibility = hidden. Ho anche appreso che puoi limitare la visibilità usando l'opzione version-script per ld.version-script e visibilità nascosta

Ora voglio sapere se è possibile combinarli. Dire che ho un programma con il seguente:

void foobar() {} 
void say_hello() {} 

Poi ho il file di script versione:

{ 
    global: 
    foobar; 
} 

E compilo questo con: -fvisibility gcc = nascosto -Wl, - versione -script = test.c -shared -o libtest.so

Quando eseguo nm in seguito, trovo che nessun simbolo viene esportato. Esiste comunque la possibilità di impostare la visibilità predefinita su hidden e utilizzare lo script di versione (o qualcos'altro) per esportare i simboli?

risposta

7

La tua domanda non ha senso: perché combattere -fvisibility con uno script del linker, quando è possibile utilizzare lo script del linker per esportare esattamente quello che ti serve, e nascondere tutto il resto:

{ 
    global: foobar; 
    local: *; 
}; 

Aggiornamento:

Poiché il codice che ho bisogno di usare questo su usi __attribute__((visibility("default"))) ...

Lo script del linker funziona perfettamente con simboli così marcati. Esempio:

// t.c 
int __attribute__((visibility("default"))) foo() { return 1; } 
int bar() { return 2; } 
int __attribute__((visibility("default"))) exported() { return 3; } 

// t.lds 
{ 
    global: exported; 
    local: *; 
}; 

gcc t.c -Wl,--version-script=t.lds -fPIC -shared -o t.so && nm -D t.so 
       w _Jv_RegisterClasses 
       w __cxa_finalize 
       w __gmon_start__ 
00000000000004f2 T exported 
+0

Poiché il codice ho bisogno di usare questo su usi __attribute __ ((visibilità ("default"))) nel codice per contrassegnare la visibilità a volte, ma a volte si basa sulla sceneggiatura linker. Il modo in cui viene gestito in questo momento è solo un gigantesco trucco e sto cercando di capire se c'è un modo migliore per farlo. –

+0

La tua domanda * ancora * non ha alcun senso. Puoi provare a spiegare quale sia la tua * reale * domanda migliore. –