Який порядок, у якому динамічний лінкер Linux шукає шляхи?


14

Це не дублікат, оскільки це стосується особливості, яку я помітив, коли використовую /etc/ld.so.conf.

Щоб отримати шляхи, за якими динамічний лінк шукає бібліотеки, я запускаю команду ldconfig -v | grep -v "^"$'\t' | sed "s/:$//g". Коли в /etc/ld.so.confньому не вказано шляхів. Вихід з попередньої команди є

/lib
/usr/lib

Я подумав, що він шукає /libспочатку, а потім /usr/lib. Коли я додаю новий шлях, наприклад /usr/local/lib, до, /etc/ld.so.confа потім переробляю /etc/ld.so.cache, вихід з ldconfig -v | grep -v "^"$'\t' | sed "s/:$//g"стає

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

Мені це дивно, тому що якщо я маю рацію, що порядок пошуку в перерахованих каталогах знаходиться зверху вниз, то додаткові каталоги шукаються перед /libі /usr/lib. Те, що додаткові каталоги шукаються перед довіреними каталогами, не є дивним самостійно, але коли /libпроводиться пошук раніше /usr/lib, це дивно, тому що /bin& /sbinшукаються після /usr/bin& /usr/sbinin PATH.

Навіть якщо шляхи, перелічені ними ldconfig -v | grep -Ev "^"$'\t' | sed "s/:$//g", шукали знизу до верху, це все одно було б перекошеним замовленням, оскільки додаткові каталоги шукатимуть довірених, а /libшукатимуть /usr/lib.

Отже, який порядок ld.soпошуку шляхів до бібліотек? Чому /libшукають раніше /usr/lib? Якщо ні, то чому шукаються додаткові каталоги /lib?

Відповіді:


17

Порядок задокументований у посібнику динамічного лінкера, який є ld.so. Це є:

  1. довідники з LD_LIBRARY_PATH;
  2. довідники з /etc/ld.so.conf;
  3. /lib;
  4. /usr/lib.

(Я трохи спрощую, див. Посібник для отримання повної інформації.)

Порядок має сенс, якщо ви вважаєте, що це єдиний спосіб переосмислити бібліотеку у типовому місці за допомогою спеціальної бібліотеки. LD_LIBRARY_PATHце налаштування користувача, воно повинно бути перед іншими. /etc/ld.so.confце локальне налаштування, воно постає перед типом операційної системи. Отже, як користувач, якщо я хочу запустити програму з іншою версією бібліотеки, я можу запустити програму, LD_LIBRARY_PATHщо містить місце розташування цієї різної бібліотечної версії. І як адміністратор, я можу поставити іншу версію бібліотеки в /usr/local/libі список /usr/local/libв /etc/ld.so.conf.

Довіра не вступає в це. Будь-якому каталогу, вказаному на цьому шляху пошуку, слід довіряти, оскільки будь-яка бібліотека може закінчитися завантаженням звідти. Теоретично ви можете перелічити назви бібліотек, які використовуються всіма програмами, «які потребують більшої довіри» у вашій системі, і переконатися, що всі ці бібліотеки присутні у «найбільш надійних» каталогах, і тоді «менш довірені» каталоги не будуть використовуватись, якщо вони з’явилися після більш довірених каталогів на шляху пошуку, за винятком програм, які вимагають меншої довіри. Але це було б надзвичайно крихко. Також було б досить безглуздо: якщо зловмисник може ввести значення LD_LIBRARY_PATHабо елемент елемента /etc/ld.so.conf, вони, безумовно, мають більш прямий шлях до виконання довільного коду, такого як введення значення PATH,LD_PRELOADі т. д. Довіра до шляху завантаження бібліотеки має значення, коли виконання виконання перетинає межу довіри, тобто під час запуску програми з додатковими привілеями (наприклад, setuid / setgid програма або via sudo). Що в цьому випадку відбувається, LD_LIBRARY_PATHце викреслити.

Що стосується /libvs /usr/lib, це не має великого значення: вони надаються тим самим об'єктом (операційною системою) і не повинно бути бібліотеки, яка присутня в обох. /libСпершу має сенс перелічити, оскільки це забезпечує (дуже крихітну) перевагу продуктивності: найбільш часто використовувані бібліотеки, особливо бібліотеки, які використовуються малими базовими програмами (для яких час завантаження становить більшу частку загального часу роботи, ніж великий, довгий -програма роботи), розташовані в /lib.


Якщо в LD_LIBRARY_PATH вказано кілька каталогів, у якому порядку вони шукають?
argentum2f

@ argentum2f Зліва направо, те саме, що PATH.
перестань бути злим"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.