Pregunta

La forma en que se desarrolló el proyecto de mi equipo, que genera una biblioteca de objetos compartidos para nuestra aplicación de todo todos nuestros archivos objeto .o. Mi tarea (es de esperar que es lo suficientemente específico, pero también lo suficientemente generales como para ser de utilidad para otros!) Es eslabón de sólo los archivos de objetos que han cambiado desde la última vez que el ejecutable fue creado. Por ejemplo, aquí está la línea de comandos que utilizo para construir el .so:

g++34 -shared -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject2.o MyObject3.o MyObject4.o   -o libMySharedLibrary.so

¿Qué funciona como se esperaba! :) Mi objetivo es ser capaz de enlace en sólo los archivos de objetos modificados desde ahora en adelante, para acelerar el proceso de vinculación simultánea. Un comando de ejemplo sería:

g++34 -shared -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject3.o   -o libMySharedLibrary.so

¿Qué actualizaría libMySharedLibrary.so con los archivos de objetos nuevos, mientras que el mantenimiento de los archivos de objetos mayores en libMySharedLibrary.so también. En realidad, cuando genero libMySharedLibrary.so usando el comando anterior, el tamaño del archivo es mucho más pequeño que el de si se incluyen todos los archivos de objetos, por lo que casi puedo estar seguro de que el comando anterior no está haciendo lo que quiero.

A través de mi investigación he encontrado que hay una opción -i para el enlazador que es lo mismo que la opción -r, que parece simplemente combinar todos los archivos de objetos en un archivo objeto grande también. Por desgracia, no parece que esto es lo que quiero.

En resumen, me gustaría eslabón de sólo los archivos de objetos cambiados después del enlace inicial, lo que resulta en proceso de vinculación más rápido para los futuros enlaces. ¿Hay alguna forma de hacer esto?

EDIT: Un ejemplo de lo que he tratado con -i/-r:

Ejemplo comando: g++34 -Wl,-r -nostdlib -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject2.o MyObject3.o MyObject4.o -o AllMyObjects.o

he tenido que añadir la etiqueta -nostdlib para que deje de gritar a mí sobre la necesidad de ella, y -shared eliminado porque los objetos compartidos no están permitidos con la etiqueta -r.

Este comando aparecería para cerrar de golpe todos mis archivos .o en un archivo grande .o. Así que si tan sólo pudiera actualizar el archivo .o que de aquí en adelante sólo con la cambió .o archivos, que sería grande. Después AllMyObjects.o fue creado inicialmente, probé este comando: g++34 -Wl,-r -nostdlib -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject3.o -o AllMyObjects.o, pero también crearía un AllMyObjects.o mucho más pequeño (archivo-en cuanto a tamaño), así que estoy asumiendo que no puede tener todos los ficheros objeto. Siento que esto es algo que estoy haciendo probable que un pequeño error en. Alguien tiene algún consejo? Gracias de antemano.

¿Fue útil?

Solución

Parece que tienes razón en -shared y -r no trabajar juntos. Yo era escéptico sobre la versión de GCC de edad, pero incluso en Ubuntu 10.10 Veo la misma:

$ ld -shared -r
/usr/bin/ld.bfd.real: -r and -shared may not be used together

Por desgracia, eso significa que hemos llegado a un callejón sin salida si necesita absolutamente objetos compartidos. Los binutils enlazador simplemente no ponerlo en práctica.

Si las bibliotecas estáticas son una opción para usted, son simplemente archivos que pueden ser fácilmente manipuladas con la utilidad ar.

De lo contrario, tendrá que buscar diferentes enlazadores o suites del compilador. No puedo garantía de que encontrará esta característica, sin embargo, parece exótico.

Otros consejos

Puede especie de obtener el comportamiento que está buscando usando bibliotecas de archivo / estáticos, pero el enlace inicial todavía tendrá la misma cantidad de tiempo.

El uso de un archivo de almacenamiento:

# Initially create the archive
ar r libmylib.a <all object files>

# Create your shared object (re-use this line after libmylib.a is updated)
g++ -shared -rdynamic -m64 -Wl,-rpath,'$ORIGIN' libmylib.a -o libmylib.so     

# Update the archive file
ar r libmylib.a updated1.o updated2.o

Como ya he dicho, todavía tomar la misma cantidad de tiempo para vincular la realidad .so como lo hacía antes.

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