2010-02-01 6 views
6

Ich versuche, mit der statischen libc.a und einer dynamischen Bibliothek .so erfolglos zu verbinden.Wie man mit dynamischer Bibliothek (.so) und statischer libc.a verbindet

habe ich tryied bereits folgendes:

  1. Zum einen teste ich mit allen dynamisch:

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

    Es funktioniert (kompilieren und ausführen)

  2. Zweitens teste ich, was ich will (dynamische lib und statische libc):

    • 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

    Es kompiliert, aber bei der Ausführung segfault! Ein strace zeigen, dass es versucht, auf libc.so zugreifen !!!

  3. Schließlich habe ich versucht, eine einfache Progamm ohne Bezug auf dynamische lib

    • gcc -static main.c zu kompilieren -> kompilieren ok, ok laufen
    • gcc main.c/usr /lib/libc.a verursacht -> kompilieren ok, führen: Segmentierungsfehler (eine strace zeigen, dass es den Zugang zu libc.so)

Wie das zu tun?

Danke

+1

Welches Betriebssystem? Mehr Leute sehen die Frage, wenn Sie ein Tag für das Betriebssystem hinzufügen, an dem Sie interessiert sind. – caf

+0

Was ist die verwendete Version von gcc? – BHS

Antwort

6

Ihren zweiten Test (die Sie tun wollen) arbeitet für mich auf 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 

Allerdings müssen Sie die gemeinsame Bibliothek erkennen, dass Sie haben Build hängt von der gemeinsamen libc ab. Es ist also natürlich, dass es versucht, es zur Laufzeit zu öffnen.

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

Ein Weg, was Sie erreichen wollen, ist, zu verwenden: -static-libgcc -Wl,-Bstatic -lc.