Нещодавно я наткнувся на посилання на проггіт, і це (на сьогодні) не пояснено.
Я підозрюю, що це може бути, але я не знаю точно.
Нещодавно я наткнувся на посилання на проггіт, і це (на сьогодні) не пояснено.
Я підозрюю, що це може бути, але я не знаю точно.
Відповіді:
Якщо встановити LD_PRELOAD
шлях спільного об'єкта, цей файл буде завантажений перед будь-якою іншою бібліотекою (включаючи час виконання C libc.so
). Тож для запуску ls
зі спеціальною malloc()
реалізацією зробіть це:
$ LD_PRELOAD=/path/to/my/malloc.so /bin/ls
LD_PRELOAD
. Причина полягає в тому, що він є змінною оточуючого середовища, він успадковується дочірніми процесами - які можуть мати інший робочий каталог, ніж батьківський процес. Отже, будь-який відносний шлях не зможе знайти бібліотеку для попереднього завантаження.
Ви можете змінити символи в фондових бібліотеках, створивши бібліотеку з тими ж символами та вказавши бібліотеку в LD_PRELOAD
.
Деякі люди використовують його для вказівки бібліотек у нестандартних місцях, але LD_LIBRARY_PATH
краще для цієї мети.
З LD_PRELOAD
вами можна віддати перевагу бібліотекам.
Наприклад, ви можете написати бібліотеку, яка реалізує malloc
та free
. І завантажуючи їх LD_PRELOAD
своїми malloc
і free
виконуватимуться, а не стандартними.
calloc
? Чи не все це зіпсувало б?
malloc
безкоштовно і спеціально розроблені в glibc, щоб це дозволило, і акція calloc
вдається зателефонувати вашим імпортованим malloc
. Не намагайтеся це робити з будь-якими іншими функціями. Це не буде так добре.
Як згадували багато людей, використовуючи LD_PRELOAD
для попереднього завантаження бібліотеку. До речі, ви можете перевірити, чи налаштування доступне ldd
командою.
Приклад: припустимо, вам потрібно попередньо завантажити власний libselinux.so.1
.
> ldd /bin/ls
...
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f3927b1d000)
libacl.so.1 => /lib/x86_64-linux-gnu/libacl.so.1 (0x00007f3927914000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f392754f000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f3927311000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f392710c000)
/lib64/ld-linux-x86-64.so.2 (0x00007f3927d65000)
libattr.so.1 => /lib/x86_64-linux-gnu/libattr.so.1 (0x00007f3926f07000)
Таким чином, встановіть ваше середовище передзавантаження:
export LD_PRELOAD=/home/patric/libselinux.so.1
Перевірте свою бібліотеку ще раз:
>ldd /bin/ls
...
libselinux.so.1 =>
/home/patric/libselinux.so.1 (0x00007fb9245d8000)
...
LD_PRELOAD
перелічує спільні бібліотеки з функціями, що перекривають стандартний набір, як і /etc/ld.so.preload
це. Вони реалізовані навантажувачем /lib/ld-linux.so
. Якщо ви хочете змінити лише декілька вибраних функцій, ви можете це зробити, створивши переважаючий файл об'єкта та налаштуванняLD_PRELOAD
; функції цього файлу об'єктів замінять лише ті функції, залишаючи інші такими, якими вони були.
Для отримання додаткової інформації про спільні бібліотеки відвідайте http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html
Ось детальна публікація в блозі про попередню завантаження:
Експортувати mylib.so
до env легко :
$ export LD_PRELOAD=/path/mylib.so
$ ./mybin
відключити:
$ export LD_PRELOAD=
unset LD_PRELOAD
коли використовується LD_PRELOAD, цей файл буде завантажений перед будь-якою іншою
$export LD_PRELOAD=/path/lib
лінком для попереднього завантаження, навіть це можна використовувати і в програмах
Використання LD_PRELOAD
шлях, ви можете змусити завантажувач додатків завантажувати наданий спільний об'єкт за вказаним типовим умовом.
Розробники використовують це для налагодження своїх додатків, надаючи різні версії спільних об'єктів.
Ми використовували його для злому певних програм, змінивши існуючі функції за допомогою підготовлених спільних об'єктів.