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:
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)
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!
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