Я пытаюсь связаться со статическим libc.a и динамическим lib .so неудачно.
У меня уже есть tryied следующее:
Во-первых я тестирую со всеми динамичными:
Это работает (скомпилируйте и выполнитесь),
Во-вторых, я тестирую то, что я хочу (динамический lib и статический libc):
Это компилирует, но при выполнении, это segfault! strace показывает, что пытается получить доступ к libc.so!!!
Наконец я попытался скомпилировать простую проножку без ссылки на динамический lib
Как сделать это?
Спасибо
Ваш второй тест (тот, который вы хотите провести) работает для меня на 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
Однако вы должны понимать, что созданная вами совместно используемая библиотека зависит от совместно используемой библиотеки libc . Итак, естественно, что он пытается открыть его во время выполнения.
$ ldd ./libtest.so
linux-gate.so.1 => (0xb80c7000)
libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7f4f000)
/lib/ld-linux.so.2 (0xb80c8000)
Один из способов добиться желаемого - использовать: -static-libgcc -Wl, -Bstatic -lc
.