как к соединению с динамическим lib (.so) и статическим libc.a

Я пытаюсь связаться со статическим libc.a и динамическим lib .so неудачно.

У меня уже есть tryied следующее:

  1. Во-первых я тестирую со всеми динамичными:

    • gcc - совместно использованный libtest.c-o libtest.so
    • gcc-c main.c-o main.o
    • gcc main.o-o тестируют-L.-ltest

    Это работает (скомпилируйте и выполнитесь),

  2. Во-вторых, я тестирую то, что я хочу (динамический lib и статический libc):

    • gcc - совместно использованный libtest.c-o libtest.so
    • gcc-c main.c-o main.o
    • gcc main.o-o тестируют libtest.so/usr/lib/libc.a

    Это компилирует, но при выполнении, это segfault! strace показывает, что пытается получить доступ к libc.so!!!

  3. Наконец я попытался скомпилировать простую проножку без ссылки на динамический lib

    • gcc - статические main.c-> компилируют хорошо, выполненный хорошо
    • gcc main.c/usr/lib/libc.a-> компилируют хорошо, выполненный: отказ сегментации (strace показывают, что это - доступ к libc.so),

Как сделать это?

Спасибо

6
задан elmarco 1 February 2010 в 11:58
поделиться

1 ответ

Ваш второй тест (тот, который вы хотите провести) работает для меня на 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 .

6
ответ дан 17 December 2019 в 02:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: