2010-02-01 14 views
6

Estoy tratando de vincular con la libc.a estática y una .so. Dinámica de forma dinámica sin éxito.cómo vincular con lib dinámica (.so) y estática libc.a

que ya haya tryied lo siguiente:

  1. En primer lugar pongo a prueba con toda dinámica:

    • gcc -o -shared libtest.c libtest.so
    • gcc -c principal .c -o main.o
    • gcc main.o -o test -L. -ltest

    Está funcionando (compilar y ejecutar)

  2. En segundo lugar pongo a prueba lo que yo quiero (lib dinámica y estática libc):

    • gcc -o -shared libtest.c libtest. por lo
    • gcc -c main.c -o main.o
    • gcc -o main.o prueba libtest.so /usr/lib/libc.a

    Está compilando, pero en la ejecución, segfault! ¡Un show de strace que intenta acceder a libc.so!

  3. Finalmente he tratado de compilar una progam simple, sin referencia a lib dinámica

    • gcc main.c -static -> compilar bien, funcionar bien
    • gcc main.c/usr /lib/libc.a -> compilar bien, ejecute: fallo de segmentación (strace un espectáculo que de acceso a libc.so)

Cómo hacer eso?

Gracias

+1

¿Qué sistema operativo? Más personas verán la pregunta si agrega una etiqueta para el SO que le interesa. – caf

+0

¿Cuál es la versión de gcc utilizada? – BHS

Respuesta

6

Su segunda prueba (el que se quiere hacer) está trabajando para mí en i686-linux:

$ cat libtest.c 
#include <stdio.h> 
void foo() { printf("%d\n", 42); } 
$ cat main.c 
#include <stdio.h> 
extern void foo(); 
int main() { puts("The answer is:"); foo(); } 
$ export LD_LIBRARY_PATH=$PWD                        
$ gcc -shared libtest.c -o libtest.so && gcc -c main.c -o main.o && gcc main.o -o test -L. -ltest && ./test   
The answer is: 
42 
$ gcc -shared libtest.c -o libtest.so && gcc -c main.c -o main.o && gcc main.o -o test libtest.so /usr/lib/libc.a && ./test 
The answer is: 
42 

Sin embargo, hay que darse cuenta de que la biblioteca compartida que haya build depende de la libc compartida. Entonces, es natural que intente abrirlo en tiempo de ejecución.

$ ldd ./libtest.so 
    linux-gate.so.1 => (0xb80c7000) 
    libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7f4f000) 
    /lib/ld-linux.so.2 (0xb80c8000) 

Una forma de lograr lo que desea es utilizar: -static-libgcc -Wl,-Bstatic -lc.

Cuestiones relacionadas