2011-08-31 41 views
10

Estoy intentando crear una biblioteca de objetos compartidos que abrirá un programa usando dlopen(). Esta biblioteca usará la funcionalidad provista por una biblioteca separada que es estática.Cómo forzar a los símbolos de una biblioteca estática a ser incluidos en una compilación de biblioteca compartida?

He incluido el indicador apropiado en la línea del enlace para obtener la biblioteca estática al vincular la dinámica (por ejemplo, tengo -lfoo para libfoo.a), y el enlazador no se queja. Sin embargo, cuando el programa principal llama a dlopen() en la biblioteca dinámica, la llamada falla con un mensaje de "símbolo indefinido" que hace referencia a un símbolo de la biblioteca estática.

Ejecutar nm indica que el símbolo en cuestión no está definido en la biblioteca dinámica, y el programa principal no lo contiene, entonces, ¿cómo puedo forzar al enlazador a que tire de este símbolo? El símbolo en sí está en la sección de datos no inicializados (tipo de símbolo "B" en la salida nm).

Respuesta

14

La opción del enlazador --whole-archive debería hacer esto. Lo usarías como, por ejemplo,

gcc -o libmyshared.so foo.o -lanothersharedlib -Wl,--whole-archive -lmystaticlib 

lo que estás experimentando es que, por defecto, el enlazador buscará los símbolos en un archivo estático que el binario que produce necesidades, y si necesita uno, se va a incluir todo el .o que la el símbolo reside en. Si su biblioteca compartida no necesita ninguno de los símbolos, no se incluirán en su biblioteca compartida.

Recuerde que el código que se convierte en una biblioteca compartida debe compilarse con opciones especiales, como -fpic, ya que incluye una biblioteca estática en su biblioteca compartida, la biblioteca estática debe compilarse con las mismas opciones.

8

Recientemente estuve buscando una solución para lo mismo. encontré usando

--undefined=symbol 

o

-u symbol 

resuelve el problema.

+0

La respuesta '--whole-archive' convertirá todos los símbolos del archivo en símbolos exportados en la biblioteca compartida. Si solo necesita un símbolo, esta respuesta crea mucho menos hinchazón en su .so. – MuertoExcobito

4

Otro hack es tomar la dirección de la función en algún lugar durante la inicialización de la biblioteca. Esto asegurará que realmente uses el símbolo.

+3

Al infractor: Dije, "piratear" – user877329

Cuestiones relacionadas