2012-12-07 7 views
50

Mam stary plik wykonywalny, który jest zaplanowany dla stosu złomu, ale jeszcze go nie ma. Opiera się na niektórych bibliotekach, które zostały usunięte z mojego środowiska, ale mam pewne niedopałki gdzieś, gdzie działa dobrze. Chciałbym wskazać ten plik wykonywalny na te biblioteki pośrednie. Tak, mógłbym ustawić LD_LIBRARY_PATH, ale ten plik wykonywalny jest wywoływany z wielu skryptów i wielu użytkowników i chciałbym go naprawić w jednym miejscu.Czy mogę zmienić "rpath" w już skompilowanym pliku binarnym?

Nie mam źródła tego i trudno je zdobyć. Zastanawiałem się - czy mogę edytować ten plik, używając edytora świadomego ELF, i dodać prostą ścieżkę do rpath, aby trafiła w nowe biblioteki? Czy to możliwe, czy po utworzeniu pliku binarnego ELF naprawiasz rzeczy w lokalizacjach i nie można ich przenieść?

+3

owinąć go w shellscript który wyznacza LD_LIBRARY_PATH i wywołuje binarny. Umieść skrypt powłoki w miejscu, które jest w PATH dzwoniącego. – wildplasser

+0

LD_LIBRARY_PATH jest dziedziczona przez procesy potomne. Możesz tego nie chcieć. – Will

+1

@ Tak, a ja już powiedziałem, że nie chcę tego robić. :) –

Odpowiedz

52

Jest to narzędzie o nazwie chrpath, które może to zrobić - prawdopodobnie jest dostępne w pakietach twojej dystrybucji.

+0

Oczywiście nie wiedziałem o tym narzędziu, dziękuję bardzo –

+6

Tylko notatkę dla użytkowników mac, 'install_name_tool' może to zrobić z flagą' -rpath' –

+1

Jeśli pojawi się błąd: ': brak ścieżki lub ścieżki Znaleziono znacznik. ", nie możesz użyć' chrpath' aby go zastąpić, ale możesz użyć 'patchelf' w tym przypadku:' patchelf --set-rpath/path/to/libaries ' – phyatt

94

Istnieje bardziej uniwersalne narzędzie niż chrpath o nazwie patchelf. Pierwotnie został stworzony do użytku w tworzeniu pakietów dla Nix i NixOS (system pakowania i dystrybucja GNU/Linux).

W przypadku nie ma rpath w binarnym (tutaj zwanym rdsamp) chrpath zawiedzie:

chrpath -r '$ORIGIN/../lib64' rdsamp 
rdsamp: no rpath or runpath tag found. 

Z drugiej strony,

patchelf --set-rpath '$ORIGIN/../lib64' rdsamp 

uda dobrze.

+6

Zwłaszcza,' patchelf' jest możliwość dodania rpath do pliku binarnego, który nie zawiera ścieżki rpath, ale - gdzie 'chrpath' tylko wydaje się być w stanie zmodyfikować już istniejący wpis. – maxschlepzig

+2

Ogólnie rzecz biorąc, warto zrozumieć subtelne rozróżnienie między 'rpath' i' runpath'. Zasadniczo można zastąpić "LD_LIBRARY_PATH", a inne nie. Aby uzyskać szczegółowe informacje, zobacz http://blog.tremily.us/posts/rpath/ –

+2

Denerwujące jest to, że zarówno 'chrpath' jak i' patchelf' są niechlujne ze swoją terminologią. Na przykład polecenie 'patchelf' pokazane powyżej zmieni' runpath', ale nie 'rpath', chyba że podasz także opcję' --force-rpath'. –

0

To zadziałało dla mnie, zastępując XORIGIN $ ORIGIN.

chrpath -r '\$\ORIGIN/../lib64' httpd