2010-04-28 16 views
6

Chcę udostępniać biblioteki współdzielone wraz z moim programem, zamiast korzystać z systemu docelowego z powodu różnic wersji.Jak utworzyć łącze do innego pliku libc?

ldd mówi mój program używa tych wspólnych bibliotekami:

linux-gate.so.1 => (0xf7ef0000)**(made by kernel)** 
libc.so.6 => /lib32/libc.so.6 (0xf7d88000)**(libc-2.7.so)** 
/lib/ld-linux.so.2 (0xf7ef1000)**(ld-2.7.so)** 

I pomyślnie połączony ld-xxx.so kompilując z:

gcc -std=c99 -D_POSIX_C_SOURCE=200112L -O2 -m32 -s -Wl,-dynamic-linker,ld-2.7.so myprogram.c 

Ale nie udało się udanym związku libc-xxx.so. Jak mogę to zrobić ?

+1

Można rozważyć statycznie łącząc swój program, jeśli masz tylko jeden plik wykonywalny. W ten sposób nikt nie straci twojej wersji libc, a jeśli usunie twój program, nie będzie mieć twojego libc. – nategoose

+0

To samo, ale statycznie: http://stackoverflow.com/questions/10763394/how-to-build-a-c- program-using-a-ustom-version-of-glibc –

Odpowiedz

7

I okazało się, jak to zrobić:

rpath określa, gdzie znajdują się przewidziane biblioteki. Ten folder powinien zawierać: libc.so.6, libdl.so.2, libgcc_s.so.1 i może więcej. Sprawdź za pomocą strace, aby dowiedzieć się, z których bibliotek korzysta twój plik binarny.

ld.so jest warunkiem łącznik

gcc -Xlinker -rpath=/default/path/to/libraries -Xlinker -I/default/path/to/libraries/ld.so program.c

6

Przekazanie -nodefaultlibs lub -nostdlib do gcc powie mu, aby nie przekazywał domyślnych bibliotek jako argumentów do ld. Będziesz wtedy mógł jawnie określić bibliotekę, z którą chcesz się połączyć. Więcej informacji i zastrzeżeń dotyczących obu opcji znajduje się na stronie man gcc(1).

+2

Uwaga ten post jest błędny. Nie musisz przekazywać żadnej z tych 2 flag. –

Powiązane problemy