Ld-linux.so kesmek ile alternatif libc kullanma; temizleyici yöntem?


13

Çok eski bir glibc ile eski bir sistemim var, bu da bir test / doğrulama çalışması dağına çıkmadan yükseltemiyoruz.

Bu sistemde birkaç kez daha yeni programlar (Java 1.7 gibi) çalıştırmam gerekiyor. Gerekli tüm kütüphaneleri paketlediğim ve bir krootta bir hizmet yürüttüğüm bir chroot çözümü seçtim.

Kroot çok sınırlayıcı ve sorunu LD_LIBRARY_PATH ile çözmeye çalışmayı tercih ederim. Ne yazık ki, bunu libc.so.6: cannot handle TLS datadenediğimde bir hata alıyorum .

Görünüşe göre kroottan da ihtiyacım var /lib/ld-linux.so.2. Bu çalışıyor:

LD_LIBRARY_PATH=/home/chroot/lib /home/chroot/lib/ld-linux.so.2 /home/chroot/bin/program

Ancak, ikili kod 'bin / java' olarak adlandırılmamışsa başarısız olan kitaplıklarını nereden yükleyeceğini belirleyerek javahilemi folyolar /proc/self/cmdline. Ayrıca java, başlatma sırasında kendini yürütür, işleri daha da karmaşık hale getirir.

Bu işi yapmak için bir son dakika girişimi, ben bir onaltılık editörü ile java ikili açtı ve dize yerini /lib/ld-linux.so.2ile /home/chroot/ld.so(bir sembolik o ve yapılan ld-linux.so.2ve işe yaradı)!

Ama bence herkes her yeni ikilinin yolunu iç içe sistemin mutlak bir yoluna yeniden yazmanın büyük bir çamur olduğunu kabul eder.

Herkes özel bir ld-linux.so dahil olmak üzere özel bir kitaplık yolu kullanmak için daha temiz bir yol biliyor mu ?

Yanıtlar:


12

Yükleyicinin yolu, onaltılık düzenleyicinizle keşfettiğiniz gibi ikili dosyaya derlenir. Aslında ikiliyi düzenlemenin doğrudan çalıştığı /lib/ld-linux.so.2ve /home/chroot/ld.soher ikisinin de aynı uzunlukta olduğu için şanslısınız . Bu dizelerin uzunlukları da ikili dosyadadır ve dizeleri doğrudan değiştirirseniz küçük sorunlara neden olabilirsiniz.

Eğer rotayı takip ederseniz , tercümanı güncellemek için patchelf gibi bir şeye bakmalısınız . Bu, tercümanı hızlı ve güvenli bir şekilde kalıcı olarak değiştirmenizi sağlar.


Şans değildi, baytlardan herhangi birini kaydırmamam gerektiğini biliyordum ;-) Ama patchelf tam istediğim gibi görünüyor. Göreceli bir yol kullanamamanın yanı sıra, bir sarıcıya ihtiyacım yok diye kullandığım LD_LIBRARY_PATH ile de ilgilenebilir. Test etme şansı bulduğumda size cevap için kredi vereceğim.
dataless

1
İşe yarıyor! Bu bana yeni-libc programlarını bu sunucudaki eski-libc programlarıyla karıştırmak için iyi bir yol verecektir. Gelecekteki okuyucular için, patchelf --set-interpreter $JAVA/lib/ld-linux.so.2 --set-rpath $JAVA/lib:$JAVA/lib/i386:$JAVA/lib/i386/jli $JAVA/bin/java$ JAVA'nın JRE'nin dizini olduğu ve tüm bağımlı kütüphaneleri toplayıp lib/JRE'nin dizinine koyduğum komut buydu.
dataless

@dataless well Bu libjvm.so'ya geçici çözüm bulmak için hala LD_LIBRARY_PATH'a ihtiyacım var, çünkü libstdc ++. so.6: paylaşılan nesne dosyasını açamıyor: Böyle bir dosya veya dizin yok [root @ 97245bbe7cc1 tensorflow-java] #
Amos

@Amos Bir süre oldu, ancak benim durumum için artık LD_LIBRARY_PATH'a ihtiyacım yoktu çünkü varsayılan java ikili dosyasından geliyor. Ancak, dolaştığımı ve java tarafından kullanılan tüm kütüphaneleri bulduğumu ve bunları java lib dir'e kopyaladığımı söylediğim bölüme dikkat edin. Eskiden istedim ldd $JAVA/bin/java. Ayrıca libnss.so gibi bazı dinamik libc olanlar da vardır
dataless
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.