2010-02-01 25 views
6

Tôi đang cố liên kết với libc.a tĩnh và lib động. Cũng không thành công.cách liên kết với lib động (.so) và static libc.a

Tôi đã tryied sau:

  1. Đầu tiên tôi thử nghiệm với tất cả động:

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

    Đó là làm việc (biên dịch và thực thi)

  2. Thứ hai tôi thử nghiệm những gì tôi muốn (lib năng động và libc tĩnh):

    • gcc -shared libtest.c -o libtest. nên
    • gcc -c main.c -o main.o
    • gcc -o main.o kiểm tra libtest.so /usr/lib/libc.a

    Đó là biên dịch, nhưng khi thực thi, nó phân đoạn! Một strace cho thấy rằng nó đang cố gắng truy cập libc.so !!!

  3. Cuối cùng tôi đã cố gắng để biên dịch một progam đơn giản không có tham chiếu đến lib động

    • gcc -static main.c -> biên dịch ok, chạy ok
    • gcc main.c/usr /lib/libc.a -> biên dịch ok, chạy: lỗi phân khúc (một chương trình strace rằng việc truy cập của nó để libc.so)

làm thế nào để làm điều đó?

Cảm ơn bạn

+1

Hệ điều hành nào? Nhiều người sẽ thấy câu hỏi nếu bạn thêm thẻ cho hệ điều hành mà bạn quan tâm. – caf

+0

Phiên bản gcc được sử dụng là gì? – BHS

Trả lời

6

thử nghiệm thứ hai của bạn (một trong những bạn muốn làm) đang làm việc cho tôi trên 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 

Tuy nhiên, bạn phải nhận ra rằng các thư viện chia sẻ mà bạn đã xây dựng tùy thuộc vào libc được chia sẻ. Vì vậy, nó là tự nhiên mà nó đang cố gắng để mở nó trong thời gian chạy.

$ ldd ./libtest.so 
    linux-gate.so.1 => (0xb80c7000) 
    libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7f4f000) 
    /lib/ld-linux.so.2 (0xb80c8000) 

Một cách để đạt được những gì bạn muốn là sử dụng: -static-libgcc -Wl,-Bstatic -lc.

Các vấn đề liên quan