2010-05-15 2 views
13

Sto costruendo una libreria condivisa su Ubuntu 9.10. Voglio esportare solo un sottoinsieme delle mie funzioni dalla libreria. Sulla piattaforma Windows, ciò avverrebbe utilizzando un file di definizione del modulo (.def) che conterrà un elenco dei nomi esterni e interni delle funzioni esportate dalla libreria.Esiste un file .def equivalente su Linux per il controllo dei nomi delle funzioni esportate in una libreria condivisa?

Ho le seguenti domande:

  1. Come posso limitare le funzioni esportate di una libreria condivisa a coloro che voglio (cioè un file di DEF equivalente)

  2. Utilizzo di file DEF come un esempio, puoi assegnare a una funzione un nome esterno diverso dal suo nome interno (utile per evitare conflitti di nomi e anche ridecorare nomi storpiati ecc.)

  3. Su Windows Posso usare il comando EXPORT (IIRC) su ch eck l'elenco delle funzioni e degli indirizzi esportati, qual è il modo equivalente di farlo su Linux?

risposta

10

Il modo più comune per fare solo alcuni simboli visibili in un oggetto condiviso su Linux è di passare il -fvisibility=hidden per gcc e poi decorare i simboli che si desidera rendere visibili con __attribute__((visibility("default"))).

Se si sta cercando una soluzione di esportazione come soluzione, è consigliabile consultare l'opzione del linker --retain-symbols-file=FILENAME che potrebbe fare ciò che si sta cercando.

Non conosco un modo semplice di esportare una funzione con un nome diverso dal nome della sua funzione, ma probabilmente è possibile con un editor elfo. Modifica: Penso che sia possibile utilizzare uno script linker (dare un'occhiata alla pagina man di ld) per assegnare valori ai simboli nella fase di collegamento, dando quindi un nome alternativo a una determinata funzione. Nota, non l'ho mai provato.

Per visualizzare i simboli visibili in un oggetto condiviso è possibile utilizzare il comando readelf. readelf -Ds se ricordo male.

+0

Non è effettivamente necessario per decorarle con visibilità impostata di default, in quanto questo è il default ... –

+1

@Fredrik Ullner: I non capisco il tuo punto. Se usi '-fvisibility = hidden' allora devi reimpostare la visibilità al default di quei simboli che non vuoi nascosti altrimenti nessun simbolo sarebbe visibile. –

+0

"quindi decora i simboli che vuoi essere visibili con __attribute __ ((visibilità (" default ")))." Non è necessario farlo, poiché questo è l'impostazione predefinita. –

7

Come posso limitare le funzioni esportate di una libreria condivisa a coloro che voglio (cioè un file di DEF equivalente)

Forse siete alla ricerca di GNU Export Maps o Symbol Versioning

g++ -shared spaceship.cpp -o libspaceship.so.1 -Wl,-soname=libspaceship.so.1 -Wl, --version-script=spaceship.expmap

+0

forse, il file di mappa ci aiuta a definire quali simboli esportare, tuttavia, a differenza del file def in windows, su linux, il linker non esegue l'errore se vede una funzione nel file map che non è definito. C'è un modo in cui posso errore se la funzione non viene trovata simile a Windows? –

4

gcc supporta anche la sintassi VC di __declspec (dllexport). Vedi this.

+0

Ma solo durante la compilazione per Windows. – Calmarius

2

Un'altra opzione è quella di utilizzare il comando strip con questo modo:

strip --keep-symbol=symbol_to_export1 --keep-symbol=symbol_to_export2 ... \ 
    libtotrip.so -o libout.so