2009-05-27 24 views
28

Digamos que tengo a.so y b.so. ¿Puedo producir c.so como una sola biblioteca compartida con todas las funciones exportadas por ayb, por supuesto resolviendo todas las intra-dependencias (es decir, todas las funciones de b.so llamado por a.so y viceversa)?Fusionar varias bibliotecas .so compartidas

me trataron

gcc -shared -Wl,soname,c.so -o c.so a.so b.so

pero no funciona.

Lo mismo sucede si puedo archivar a.o y b.o en a.a y B.A. (que no debería modificar a.o y b.o), y hago

gcc -shared -Wl,soname,c.so -o c.so a.a b.a

Gracias

+0

Al final recurrí a utilizar un script de biblioteca con un grupo que me permite mostrar todas las pequeñas bibliotecas como una sola, pero un software podría simplemente enlazar con la "sub biblioteca" correcta. – Metiu

Respuesta

38

La fusión de varias bibliotecas compartidas en una es realmente prácticamente imposible en todos los UNIXen, excepto en AIX: el vinculador considera el .so un producto "final".

Pero la fusión de archivos en .so no debería ser un problema:

gcc -shared -o c.so -Wl,--whole-archive a.a b.a -Wl,--no-whole-archive 
+0

Gracias por la útil bandera: ¡archivo completo! –

+0

¿El orden de los archivos es importante aquí? Si tengo un montón de archivos .a, ¿puedo usar * .a? – Raj

+1

@Raj No, el pedido no importa; todos se incluirán en su totalidad. Si no tiene redefiniciones de símbolos en su '* .a', entonces' * .a' solo funcionará (TM). –

7

En la práctica, no es posible.

Desde el punto de vista del enlazador, una biblioteca SO es un producto final que no contiene la información de reubicación necesaria para el enlace.

Si tiene acceso a los archivos de origen o de objeto para ambas bibliotecas, es sencillo compilar/vincular un SO combinado de ellos.

+1

"si tiene acceso a los archivos de origen o de objeto para ambas bibliotecas, es sencillo compilar/vincular un SO combinado de ellos". --- Cómo hago esto ? Específicamente, en la plataforma Android. –

Cuestiones relacionadas