make library gcc linker shared-libraries static-libraries

gcc - library - cómo vincular con dynamic lib(.so) y static libc.a



make shared libraries (1)

Tu segunda prueba (la que quieres hacer) me funciona 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, debe tener en cuenta que la biblioteca compartida que ha creado depende de la biblioteca 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 usar: -static-libgcc -Wl,-Bstatic -lc .

Estoy tratando de vincular con la libc.a estática y una .va dinámica sin éxito.

Ya he intentado lo siguiente:

  1. Primero pruebo con todo dinámico:

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

    Está funcionando (compilar y ejecutar)

  2. En segundo lugar, pruebo lo que quiero (dynamic lib y static libc):

    • 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

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

  3. Finalmente, he intentado compilar un programa simple sin referencia a la lib dinámica

    • gcc -static main.c -> compilar ok, ejecutar ok
    • gcc main.c /usr/lib/libc.a -> compile ok, run: falla de segmentación (una prueba muestra que es acceso a libc.so)

¿Como hacer eso?

Gracias