Mam stary plik wykonywalny zaplanowany na stertę złomu, ale jeszcze go tam nie ma. Opiera się na niektórych bibliotekach, które zostały usunięte z mojego środowiska, ale mam kilka bibliotek zastępczych gdzieś, gdzie działa dobrze. Chciałbym wskazać ten plik wykonywalny na te biblioteki zastępcze. 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 to naprawić w jednym miejscu.
Nie mam źródła tego i trudno byłoby to zdobyć. Zastanawiałem się - czy mogę edytować ten plik, używając edytora obsługującego ELF i dodać prostą PATH do rpath, aby trafił do nowych bibliotek? Czy to możliwe, czy po utworzeniu pliku binarnego ELF naprawiasz rzeczy w lokalizacjach i nie można ich przenieść?
Odpowiedzi:
Jest narzędzie o nazwie,
chrpath
które może to zrobić - prawdopodobnie jest dostępne w pakietach twojej dystrybucji.źródło
install_name_tool
mogą to zrobić za pomocą-rpath
flagi<binary>: no rpath or runpath tag found.
chrpath
patchelf
patchelf --set-rpath /path/to/libaries <binary>
Istnieje bardziej uniwersalne narzędzie niż
chrpath
zwanepatchelf
. Pierwotnie został stworzony do tworzenia pakietów dla Nix i NixOS (system pakowania i dystrybucja GNU / Linux).W przypadku braku rpath w pliku binarnym (zwanym tutaj rdsamp),
chrpath
kończy się niepowodzeniem:Z drugiej strony,
udaje się dobrze.
źródło
patchelf
jest w stanie dodać rpath do pliku binarnego, który jeszcze nie zawiera rpath - gdziechrpath
tylko wydaje się, że jest w stanie zmodyfikować już istniejący wpis.rpath
irunpath
. Zasadniczo jeden może zastąpić,LD_LIBRARY_PATH
a drugi nie. Aby uzyskać szczegółowe informacje, patrz blog.tremily.us/posts/rpathchrpath
ipatchelf
są niedbali w swojej terminologii. Na przykładpatchelf
polecenie pokazane powyżej zmieni się,runpath
ale nie,rpath
chyba że podasz również--force-rpath
opcję.patchelf
wyjaśnia: "--set-rpath
,--shrink-rpath
a--print-rpath
teraz woląDT_RUNPATH
ciąguDT_RPATH
, który jest przestarzały podczas aktualizacji, jeśli oba są obecne, oba są aktualizowane Jeśli tylko DT_RPATH jest obecny, to przekształca się..DT_RUNPATH
Chyba że--force-rpath
określono Jeśli nie jest obecny. ,DT_RUNPATH
dodaje się a, chyba że--force-rpath
określono, w którym to przypadkuDT_RPATH
dodaje się a. " Nazwa opcji prawdopodobnie pozostała niezmieniona ze względu na kompatybilność.Tak jak powiedział @ user7610, właściwą drogą jest
patchelf
narzędzie.Ale czuję, że mogę udzielić bardziej kompleksowej odpowiedzi, obejmującej wszystkie polecenia, których potrzeba, aby to zrobić.
Aby uzyskać obszerny artykuł na ten temat, kliknij tutaj
Przede wszystkim wielu programistów mówi o tym
RPATH
, ale tak naprawdę mają na myśliRUNPATH
. Są to dwie różne opcjonalne sekcje dynamiczne, które są obsługiwane przez program ładujący w różny sposób. Więcej o różnicy między nimi przeczytasz w linku, o którym wspomniałem wcześniej.Na razie pamiętaj tylko:
RUNPATH
jest ustawione,RPATH
jest ignorowanaRPATH
jest przestarzały i należy go unikaćRUNPATH
jest preferowany, ponieważ można go zastąpićLD_LIBRARY_PATH
Zobacz aktualną ŚCIEŻKĘ R [UN]
Wyczyść R [UN] PATH
Uwagi:
RPATH
iRUNPATH
Dodaj wartości do R [UN] PATH
Uwagi:
<desired-path>
to lista katalogów oddzielonych przecinkami, np .:/my/libs:/my/other/libs
--force-rpath
, ustawiaRPATH
, w przeciwnym razie ustawiaRUNPATH
źródło
-Wl,-R,<desired-rpath> -Wl,--enable-new-dtags
zestawyDT_RUNPATH
i to jest ten, którego większość ludzi powinna używać.RUNPATH
może zostać zastąpiony przezLD_LIBRARY_PATH
, więc ludzie nie powinni używać--force-rpath
.<desired-path>
użyto dwukropka; powinien to być przecinek (czyli:)/my/libs,/my/other/libs
.To zadziałało dla mnie, zastępując XORIGIN $ ORIGIN.
chrpath -r '\$\ORIGIN/../lib64' httpd
źródło