2010-02-01 22 views
6

Statik libc.a ve dinamik lib.so ile bağlantı kurmaya çalışıyorum.dinamik lib (.so) ve statik libc.a ile bağlantı kurulabilir.

  1. Öncelikle tüm dinamik ile sınamak: Ana -c

    • gcc -shared libtest.c -o libtest.so
    • gcc

      Zaten şu tryied ettik .c -o main.o
    • gcc main.o -o test -L.

    -ltest O (derlemek ve yürütmek)

  2. İkincisi ben (dinamik lib ve statik libc'yi) istediğini sınamak çalışıyor:

    • gcc -shared libtest.c -o libtest. böylece
    • /usr/lib/libc.a
    libtest.so
  3. gcc -c main.c -o main.o
  4. gcc main.o -o testi

    Derleme, ancak yürütme sırasında, bu segfault! Bir strace, libc.so'ya erişmeye çalıştığını gösteriyor! > Derlemek Tamam, koşmak ok

  5. gcc main.c/usr -

  6. Sonunda dinamik lib için hiçbir referans

    • gcc -static main.c ile basit progam derlemeye çalıştık /lib/libc.a -> Tamam, koşmak derlemek: segmentasyon hatası ('s erişim libc.so bir strace gösterisi)

bunu nasıl yapmalı?

size

+1

Hangi İşletim Sistemi? İlgilendiğiniz işletim sistemi için bir etiket eklerseniz daha fazla kişi bu soruyu görür. – caf

+0

Gcc sürümü ne işe yarar? – BHS

cevap

6

Kişisel ikinci testi (Yapmak istediğiniz bir) i686-linux üzerinde benim için çalışıyor ederiz: Ancak

$ 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 

, paylaşılan kitaplık ettik gerçekleştirmek zorunda derlemesi, paylaşılan libc'a bağlıdır. Yani, çalışma zamanında açmaya çalıştığı doğaldır. İstediğinizi elde etmek

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

bir yolu kullanmaktır: -static-libgcc -Wl,-Bstatic -lc.

İlgili konular