Pregunta

Estoy construyendo .so biblioteca y preguntaba - ¿cuál es la diferencia b / cc opción de compilador -H y -o (utilizando el Sun Studio C ++) w?

¿No se están refiriendo a la misma cosa - el nombre del archivo de salida

¿Fue útil?

Solución

-o es el nombre del archivo que se escribe en el disco por el compilador

-h es el nombre que se registra en binarios ELF que enlazan contra este archivo.

Un uso común es proporcionar los números de versión menor de la biblioteca. Por ejemplo, si va a crear la biblioteca compartida libtal, es posible hacer:

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

A continuación, si compila su aplicación hola mundo y el enlace en ella con

cc -o hello -lfoo

el binario ELF para hola registrará una entrada para NEEDED libfoo.so.1 (que se puede ver ejecutando elfdump -d hello).

A continuación, cuando se necesita añadir nuevas funciones más adelante, puede cambiar el valor a -o libfoo.so.1.1 pero dejar el -h en libfoo.so.1 - todos los programas que ya construidos con 1,0 Todavía intentará cargar libfoo.so.1 en tiempo de ejecución, por lo que seguirá trabajando sin estar reconstruido, pero se verá a través de ls que es 1.1.

Esto también se usa en la construcción de bibliotecas en el mismo directorio que están se utiliza en tiempo de ejecución, si usted no tiene un directorio de instalación por separado o instalar a través de un sistema de envasado. Para evitar chocar programas que se ejecutan cuando se sobrescribir el binario de la biblioteca, y para evitar los programas de no ser capaz de empezar cuando estás en el medio del edificio, algunos Makefile hará:

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

(Makefile construidas por el generador de edad makefile Imake de X comúnmente hacer esto).

Otros consejos

Se refieren a diferentes nombres. En concreto, la opción -o es real el nombre del archivo - el que está en el sistema de archivos. La opción -h establece el DT_SONAME interna en el archivo objeto final. Este es el nombre con el que se referencia el objeto compartido internamente por otros módulos. Creo que es el nombre que también se ve cuando se ejecuta ldd en los objetos que enlazan con ella.

La opción -o será el nombre del archivo de salida, mientras que la opción -h fijará un nombre intrínseca dentro de la biblioteca. Este nombre intrínseca tiene prioridad sobre el nombre del archivo cuando es utilizado por el cargador dinámico y permite que se utilice reglas predefinidas para mirar la biblioteca derecha.

Se puede ver qué nombre intrínseca se registró en una biblioteca dada con ese comando:

elfdump -d xxx.so | grep SONAME

Tener una mirada aquí para más detalles:

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top