Linux'un dinamik bağlayıcısının yolları aradığı sıra nedir?


14

Bu bir kopya değil, çünkü bu kullandığımda fark ettiğim bir tuhaflık ile uğraşıyor /etc/ld.so.conf.

Dinamik bağlayıcının kitaplıkları aradığı yolları almak için komutu çalıştırıyorum ldconfig -v | grep -v "^"$'\t' | sed "s/:$//g". Ne zaman /etc/ld.so.confo listelenmiş yolları vardır. Önceki komuttan çıktı

/lib
/usr/lib

/libÖnce ve sonra aradığını düşündüm /usr/lib. Ben gibi yeni bir yol, eklediğinizde /usr/local/libiçin, /etc/ld.so.confyeniden çevrimi sonra ve /etc/ld.so.cacheçıkış dan ldconfig -v | grep -v "^"$'\t' | sed "s/:$//g"olur

/usr/local/lib
/lib
/usr/lib

Bu garip buluyorum çünkü listelenen dizinlerin aranan sıra yukarıdan aşağıya doğru ise, ek dizinler önce /libve aranır /usr/lib. Ek dizinleri güvenilen dizinleri önce aranır Yani kendi başına garip değil, ama ne zaman /libönce aranır /usr/libçünkü garip olduğunu, /binve /sbinsonra aranır /usr/bin& /usr/sbiniçinde PATH.

Listelenen yollar ldconfig -v | grep -Ev "^"$'\t' | sed "s/:$//g"aşağıdan yukarıya doğru aranmış olsa bile , yine de çarpık bir sıralama olurdu çünkü güvenilenlerden sonra ek dizinler aranacakken /libaranacaktı /usr/lib.

Peki, ld.sokitaplıkların yollarını arama sırası nedir? Neden daha /libönce aranıyor /usr/lib? Değilse, neden ek dizinler aranır /lib?

Yanıtlar:


17

Sıra, dinamik bağlayıcı kılavuzunda belgelenmiştir ld.so. Bu:

  1. dizinleri LD_LIBRARY_PATH;
  2. dizinleri /etc/ld.so.conf;
  3. /lib;
  4. /usr/lib.

(Biraz basitleştiriyorum, tüm ayrıntılar için kılavuza bakın.)

Özel bir kitaplıkla varsayılan bir konumdaki kitaplığı geçersiz kılmanın tek yolu olduğunu düşündüğünüzde, sipariş mantıklıdır. LD_LIBRARY_PATHbir kullanıcı ayarıdır, diğerlerinden önce gelmelidir. /etc/ld.so.confyerel bir ayardır, işletim sistemi varsayılanından önce gelir. Kullanıcı olarak, bir kütüphanenin farklı bir sürümüne sahip bir program çalıştırmak istersem, programı LD_LIBRARY_PATHbu farklı kütüphane sürümünün konumunu içeren bir şekilde çalıştırabilirim . Ve bir yönetici olarak, ben farklı kütüphanenin sürümünü koyabilirsiniz /usr/local/libve listeyi /usr/local/libiçinde /etc/ld.so.conf.

Güven buna girmez. Bu arama yolunda listelenen herhangi bir dizine güvenilmelidir, çünkü herhangi bir kütüphane oradan yüklenebilir. Teorik olarak, sisteminizde “daha ​​fazla güven gerektiren” tüm programlar tarafından kullanılan kütüphane adlarını listeleyebilir ve tüm bu kütüphanelerin “en güvenilir” dizinlerde bulunduğundan emin olabilirsiniz ve daha sonra “daha ​​az güvenilen” dizinlerin "daha az güven gerektiren" programlar dışında arama yolundaki daha güvenilir dizinlerden sonra geldiyse kullanılabilir. Ama bu son derece kırılgan olurdu. Aynı zamanda oldukça anlamsız olurdu: Eğer bir saldırganın bir değerini LD_LIBRARY_PATHveya bir öğesini enjekte edebilirse /etc/ld.so.conf, kesinlikle bir kodunu girmek gibi rastgele kod yürütmek için daha doğrudan bir yolu vardır PATH.LD_PRELOADKütüphane yükleme yolundaki güven, yürütme bir güven sınırını aştığında, örneğin ek ayrıcalıklara sahip bir program çalıştırırken (örn. setuid / setgid programı veya üzerinden sudo) önemli olur. Bu durumda olan LD_LIBRARY_PATHşey boş bırakılmış olmasıdır.

Gelince /libvs /usr/lib, çok önemli değil yapar: onlar aynı varlık (işletim sistemi) tarafından sağlanan konum ve hem de mevcut olan bir kütüphane olmamalıdır. İlk olarak listelemek mantıklıdır /libçünkü (çok küçük) bir performans avantajı sağlar: en sık kullanılan kütüphaneler, özellikle küçük temel programlar tarafından kullanılan kütüphaneler (yükleme süresi toplam çalışma süresinin büyük, uzuntan daha yüksek bir kısmıdır) -running program), içerisinde yer alır /lib.


LD_LIBRARY_PATH içinde birden fazla dizin listeleniyorsa hangi sırada aranırlar?
argentum2f

@ argentum2f Soldan sağa, ile aynı PATH.
Gilles 'SO- kötü olmayı bırak'
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.