Mam starszy system z bardzo starą biblioteką glibc, której nie możemy zaktualizować bez ponoszenia ogromnych prac związanych z testowaniem / sprawdzaniem poprawności.
Kilka razy musiałem uruchamiać w tym systemie nowsze programy (takie jak Java 1.7). Wybrałem rozwiązanie chroot, w którym pakuję wszystkie potrzebne biblioteki i uruchamiam usługę w chroot.
Chroot jest jednak bardzo ograniczający i wolałbym spróbować rozwiązać problem z LD_LIBRARY_PATH. Niestety libc.so.6: cannot handle TLS data
pojawia się błąd, gdy próbuję tego.
Okazuje się, że potrzebuję /lib/ld-linux.so.2
również chroota. To działa:
LD_LIBRARY_PATH=/home/chroot/lib /home/chroot/lib/ld-linux.so.2 /home/chroot/bin/program
Jednak java
udaremnia moją sztuczkę, sprawdzając, /proc/self/cmdline
gdzie należy załadować biblioteki, co kończy się niepowodzeniem, jeśli plik binarny nie został nazwany „bin / java”. Również Java wykonuje się podczas uruchamiania, co dodatkowo komplikuje sprawy.
W próbie ostatniej szansy dokonania tej pracy, otworzyłem binarnego java z edytorem hex i zastąpić ciąg /lib/ld-linux.so.2
z /home/chroot/ld.so
(i wykonane, że dowiązaniem do ld-linux.so.2
), i to działa!
Ale myślę, że wszyscy zgodziliby się, że przerobienie ścieżki każdego nowego pliku binarnego na bezwzględną ścieżkę zagnieżdżonego systemu jest ogromną kludge.
Czy ktoś zna lepszy sposób korzystania z niestandardowej ścieżki biblioteki, w tym niestandardowej ld-linux.so?
źródło
patchelf --set-interpreter $JAVA/lib/ld-linux.so.2 --set-rpath $JAVA/lib:$JAVA/lib/i386:$JAVA/lib/i386/jli $JAVA/bin/java
: gdzie $ JAVA jest katalogiem środowiska JRE i gdzie zaokrągliłem wszystkie zależne biblioteki i umieściłem je wlib/
katalogu środowiska JRE.ldd $JAVA/bin/java
dostawałem ist. Są też takie dynamiczne, jak libnss.so