как связать с динамическим lib (.so) и статическим libc.a - PullRequest
6 голосов
/ 01 февраля 2010

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

Я уже попробовал следующее:

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

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

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

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

    • 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

    Он компилируется, но при исполнении - это ошибка! Прямое шоу, которое пытается получить доступ к libc.so !!!

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

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

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

Спасибо

1 Ответ

6 голосов
/ 11 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...