2009-04-27 2 views
7

Su Linux con la toolchain GNU, so come controllare i simboli esportati da una libreria condivisa con uno script di versione (gcc -Wl, - version-script = symbols.map), ma vorrei elencare i simboli esportati sul invece la riga di comando. IOW, vorrei l'equivalente diLinker GNU: alternativa a --version-script per elencare i simboli esportati sulla riga di comando?

link /EXPORT:foo 

dalla toolchain MS. È possibile ?

EDIT:

La mia domanda non può essere molto clearn: se ho un libfoo.so biblioteca, e voglio solo le librerie di esportazione foo1 e foo2, posso andare creare una versione foo.linux script come segue

libfoo.so 
{ 
global: 
    foo1; 
    foo2; 
local: 
    *; 
} 

e fare

gcc -shared foo.c -Wl,--version-script=foo.linux -o libfoo.so -soname libfoo.so 

Vorrei essere in grado di fare qualcosa di simile, invece:

gcc -shared foo.c -Wl,--export-symbol=foo1 -Wl,--export-symbol=foo2 -o libfoo.so -soname libfoo.so 

risposta

3

Non sono sicuro che tu possa farlo come vuoi. Un modo è con lo script di versione del linker come hai menzionato. Un altro modo è aggiungere il codice sorgente __attribute__ ((visibility("default"))) per qualsiasi cosa si desideri esportare e compilare tutto con -fvisibility=hidden

+0

Sì, sembra che a fare quello che voglio non è semplicemente possibile in questo momento. Usare l'attributo è esattamente ciò che voglio evitare –

-1

readelf e objdump hanno un sacco di opzioni. Che ne dici di:

readelf --symbols --use-dynamic $yourlib.so 
0

Potrei avere otto anni di ritardo, ma sì, in realtà puoi fare quello che vuoi.

Uso Bash process substitution:

gcc -shared foo.c -Wl,--version-script=<(echo "{global:foo1;foo2;local:*;};") -o libfoo.so -soname libfoo.so