2010-02-01 11 views
6

Sto provando a collegarmi con la libc.a statica e una lib dinamica, senza successo.come linkare con lib dinamico (.so) e static libc.a

ho già tryied il seguente:

  1. In primo luogo provo con tutte le dinamiche:

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

    E 'di lavoro (compilare ed eseguire)

  2. In secondo luogo ho testare quello che voglio (lib dinamica e libc statica):

    • gcc -shared libtest.c -o libtest. così
    • gcc -c main.c -o main.o
    • gcc main.o -o prova libtest.so /usr/lib/libc.a

    Si sta compilando, ma in esecuzione, segfault! Uno strace mostra che sta provando ad accedere a libc.so !!!

  3. Infine ho provato a compilare un semplice progamma senza alcun riferimento alla dinamica lib

    • gcc main.c -static -> compilare ok, ok eseguire
    • gcc main.c/usr /lib/libc.a -> compilare ok, eseguire: errore di segmentazione (uno spettacolo strace che di accesso a libc.so)

Come farlo?

Grazie

+1

Quale sistema operativo? Altre persone vedranno la domanda se aggiungi un tag per il sistema operativo a cui sei interessato. – caf

+0

Qual è la versione di gcc utilizzata? – BHS

risposta

6

tuo secondo test (quello che si vuole fare) sta lavorando per me su 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 

Tuttavia, è necessario rendersi conto che la libreria condivisa che hai build dipende dalla libc condivisa. Quindi, è naturale che stia cercando di aprirlo in fase di runtime.

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

Un modo per ottenere ciò che si desidera è di usare: -static-libgcc -Wl,-Bstatic -lc.