Domanda

Sto costruendo .so biblioteca e chiedevo - qual è la differenza b / w opzione cc compilatore -h e -o (utilizzando il Sun Studio C ++)?

Non stanno si riferiscono alla stessa cosa -? Il nome del file di output

È stato utile?

Soluzione

-o è il nome del file che verrà scritto su disco dal compilatore

-h è il nome che verrà registrato in binari ELF che puntano contro questo file.

Un uso comune è quello di fornire i numeri di versione minore di libreria. Per esempio, se si sta creando il libfoo libreria condivisa, si potrebbe fare:

cc -o libfoo.so.1.0 -h libfoo.so.1 *.o
ln -s libfoo.so.1.0 libfoo.so.1
ln -s libfoo.so libfoo.so.1

Poi, se si compila il ciao App World e il collegamento contro di esso con il

cc -o hello -lfoo

il binario ELF per ciao registrerà una voce NEEDED per libfoo.so.1 (che si può vedi eseguendo elfdump -d hello).

Poi, quando è necessario aggiungere nuove funzioni in seguito, è possibile modificare il valore di -o libfoo.so.1.1 ma lasciare il -h a libfoo.so.1 - tutti i programmi che già costruito con 1,0 ancora tentare di caricare libfoo.so.1 in fase di esecuzione, così continuare a lavorare senza essere ricostruita, ma vedrete via ls che si tratta di 1.1.

Questa è talvolta usato per la costruzione di librerie nella stessa directory sono utilizzato in fase di esecuzione, se non si dispone di una directory di installazione separata o installare tramite un sistema di imballaggio. Per evitare di sbattere contro i programmi che sono in esecuzione quando si sovrascrivere il file binario biblioteca, e per evitare di programmi non essere in grado di iniziare a quando siete nel bel mezzo di costruzione, alcuni Makefile farà:

cc -o libfoo.so.1.new -h libfoo.so.1 *.o
rm libfoo.so.1 ; mv libfoo.so.1.new libfoo.so.1

(Makefiles costruite dal vecchio generatore makefile Imake da X comunemente fare questo.)

Altri suggerimenti

Si riferiscono a nomi diversi. In particolare, l'opzione -o è del file reale nome - quello sul filesystem. L'opzione -h imposta il interno DT_SONAME nel file oggetto finale. Questo è il nome con cui l'oggetto condiviso viene fatto riferimento internamente da altri moduli. Credo che sia il nome che si vede anche quando si esegue ldd su oggetti che puntano ad esso.

L'opzione -o sarà il nome del file di output, mentre l'opzione -h imposterà un nome intrinseca all'interno della libreria. Questo nome intrinseca ha la precedenza sul nome del file quando viene utilizzato dal caricatore dinamico e permette di utilizzare regole predefinite per sbirciare la libreria destra.

Si può vedere quale nome intrinseca è stato registrato in una data libreria con quel comando:

elfdump -d xxx.so | grep Soname

Date un'occhiata qui per i dettagli:

http://docs.oracle.com /cd/E23824_01/html/819-0690/chapter4-97194.html

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top