2013-02-18 16 views
9

Pracuję nad projektem, który używa sterowników ftdi D2XX do połączenia z urządzeniem ENTTEC DMX usb pro. Sterowniki ftdi (libftdi2xx.so.1.1.12 przechowywane w katalogu/usr/local/lib /) są kompilowane w stosunku do wersji glibc v2.14 lub wyższej.Łączenie skompilowanej biblioteki z nowszą wersją glibc

Rozwijam się na debian 7, który obsługuje tylko do glibc v2.13. Podczas wykonywania kodu C napisałem (że dzwoni do FTDI kierowców) daje błąd:

./a.out: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by /usr/local/lib/libftd2xx.so) 

Ma to sens, wiedząc, że wersja glibc jest niezgodna. I pobraniu i zainstalowaniu najnowszej wersji glibc (v2.17) do katalogu tymczasowego ('~/glibc-testing/install/lib /') na moim komputerze i za pomocą połączenia:

~/glibc-testing/install/lib/ld-linux-x86-64.so.2 --library-path ~/glibc-testing/install/lib/ ./a.out 

Z to połączenie, mogę pomyślnie uruchomić kod C.

Chciałbym skompilować ten kod C do biblioteki współdzielonej. Będzie on używany do połączenia z urządzeniem DMX i będzie wywoływany przez główną aplikację opracowaną na C#.

Nie jestem pewien, jak posunąć się do przodu. To, co muszę zrobić, to powiedzieć sterownikowi fdti, aby zawsze korzystał z nowszej wersji glibc, pozwalając reszcie aplikacji korzystać z normalnych bibliotek. Sterowniki ftdi 2DXX są dostępne tylko przed skompilowaniem (brak kodu źródłowego). Czy istnieje sposób na połączenie tego skompilowanego programu z nową biblioteką?

Zajrzałem do opcji, w których eksportuję LD_LIBRARY_PATH =/home /.../ glibc/install/lib/i odniosłem niewielki sukces.

Dziękujemy!

+5

Jedynym rozsądnym sposobem działania byłoby skontaktowanie się z kimkolwiek, kto jest kierowcą i zażądanie wersji powiązanej ze starszą wersją glibc. –

+0

Czy próbowałeś używać LD_PRELOAD? – maha

+0

Myślę, że ustawienie rpath powinno załatwić sprawę, zobacz [tutaj] (http://www.eyrie.org/~eagle/notes/rpath.html). [Możesz nawet zresetować ścieżkę rpath w aplikacji po kompilacji] (https://stackoverflow.com/questions/13769141/can-i-change-rpath-in-an-already-compiled-binary)! – Bort

Odpowiedz

0

jednym z wariantów jest debian aktualizacji do sid.

innym rozwiązaniem jest zamiana pliku /etc/ld.so.conf.d/libc.conf i /etc/ld.so.conf.d/x86_64-linux-gnu.conf

Pliki te zawierają ścieżkę szukać bibliotek w systemie.

0

Można użyć PatchELF zmodyfikować rpath dostarczonego udostępnionej biblioteki:

$ patchelf --set-rpath /home/user/glibc-testing/install/lib/ libftdi2xx.so.1.1.12 

A potem skompilować bibliotekę współdzieloną za pomocą:

$ gcc -Wl,-rpath=/home/user/glibc-testing/install/lib/ <rest of flags> 

Wszelkie wykonywalne kompilowania będą musiały być zestawiane z :

$ gcc -Wl,-rpath=/home/user/glibc-testing/install/lib/ -Wl,--dynamic-linker=/home/user/glibc-testing/install/lib/ld-linux-x86-64.so.2 <rest of flags> 
1

Możesz podać brakujące funkcje we własnym zakresie kod, ale pamiętaj, że są one wersjonowane, możesz albo dostarczyć plik mapy, albo zrobić wszystko razem z kodem. Przykład:

#define SYMVER(ver, sym) __asm__(".symver " #sym "," #sym "@" #ver "\n") 

SYMVER(GLIBC_2.14, foo); 
int foo(int a, char *b) 
{ 
    return 4; 
} 

Aby dowiedzieć się, co do wykonania, można użyć readelf:

readelf -s /usr/local/lib/libftd2xx.so | grep '@GLIBC_2\.14' 

to jest to, o ile funkcje przejść.

Teraz trudną częścią jest sprawienie, aby program ładujący uwierzył, że ma odpowiednią bibliotekę (chyba że chcesz zaimplementować własny program ładujący), ponieważ musisz załatać bibliotekę, aby usunąć odniesienie do GLIBC_2.14, ponieważ spójrz w szczególności na bibliotekę libc.

Istnieje kilka sposobów postępowania; zdecydowanie najprościej zastąpić GLIBC_2.14 z GLIBC_2.14 z GLIBC_2.13, należy pamiętać, że musisz zdefiniować swoje symbole z wersją zamienną (tj. GLIBC_2.13), ponieważ wersje są przechowywane przez odniesienie.

Dzięki temu program powinien działać.

Teraz teoretycznie mógłbyś zamiast:

  • Przetwarza plik ELF, znaleźć wejścia DYNAMIC typu w programie nagłówków, tam szukać wpisu VERNEED, i wreszcie po że jedna zalecana znajdź tabelę wymagań, gdzie możesz przyciąć referencję (możesz również użyć nagłówka sekcji .gnu.version_r, aby uzyskać tam dostęp, jeśli jest dostępny).

  • Alternatywnie można napisać moduł ładujący, który łączy standardowy program ładujący , ale używa ptrace do nadpisania wyszukiwania.

Powiązane problemy