2013-08-27 18 views
10

Mój program zależy od libcurl.so.3, ale w RHEL6, nie ma miękkiego jak ten libcurl.so.3 ->libcurl.so.4 (mój program może działać sprawnie, gdy utworzę ten link). Ale jest takie miękkie łącze: libcurl.so->libcurl.so.4.Czy istnieje sposób, aby zmienić SONAME pliku binarnego bezpośrednio?

Chciałbym zmodyfikować SONAME z libcurl.so.3.0.0.0 bezpośrednio z libcurl.so.3 na libcurl.so. Wtedy mogę uruchomić mój program na RHEL 6 bez tworzenia miękkiego łącza.

Może moje rozwiązanie jest głupie, ale myślę, że nauka modyfikowania binarnego bezpośrednio jest interesującą rzeczą.

Przepraszam za komentarz, devnull. może nie powiedziałem jasno.

$ readelf -d libcurl.so.3.0.0

dynamiczny segment na offsetowej 0x303cc zawiera 25 pozycje:

Tag Type Nazwa/Wartość

0x00000001 (potrzebne) wspólna biblioteka: [libssl .so.2]

0x0000000e (soname) soname Biblioteka: [libcurl.so.3] ---> chciałbym zmienić to libcurl.so

+0

Co mówisz jest * * zmiana nazwy pliku lub dowiązania, to nie zmieniającą * * binarnym. – devnull

+1

Możesz utworzyć kopię pliku "libcurl.so.4", zmienić nazwę na "libcurl.so.3" i użyć edytora szesnastkowego, aby zmienić nazwę wpisu SONAME z "libcurl.so.4" na "libcurl.so.3 ". Często to nie zadziała, ponieważ informacje o wersji są również obecne w bibliotekach dynamicznych. –

+0

Myślę, że najprostszym sposobem na to jest odbudowanie biblioteki libcurl i zhackowanie reguł kompilacji, aby uzyskać SONAME, której potrzebujesz. W przypadku zmian po kompilacji nie zalecałbym edycji binarnej. Istnieje projekt na temat łatania formatu ELF http://nixos.org/patchelf.html, nie pozwala on na zmianę SONAME, ale może dostarczyć trochę pomysłu na wdrożenie tego typu. – joetde

Odpowiedz

0

Należy unikać usuwania wersji obiektu SO, na przykład gdy aplikacja jest zależna od określonej biblioteki libc (libc.so.6).

Właściwym sposobem, aby to zrobić, jeśli chcesz użyć innego lib używa zmiennej LD_PRELOAD przed wywołaniem aplikacja

Jeśli ustawisz LD_PRELOAD na ścieżkę nowego pliku, plik zostanie załadowany przed jakimkolwiek inna biblioteka (w tym nawet środowisko wykonawcze C, libc.so).

2

Tak, można użyć patchelf takiego (od jego Readme):

patchelf --set-soname libnewname.so.3.4.5 path/to/libmylibrary.so.1.2.3 
Powiązane problemy