Нещодавно я наткнувся на посилання на проггіт, і це (на сьогодні) не пояснено.
Я підозрюю, що це може бути, але я не знаю точно.
Нещодавно я наткнувся на посилання на проггіт, і це (на сьогодні) не пояснено.
Я підозрюю, що це може бути, але я не знаю точно.
Відповіді:
Якщо встановити 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 шлях, ви можете змусити завантажувач додатків завантажувати наданий спільний об'єкт за вказаним типовим умовом.
Розробники використовують це для налагодження своїх додатків, надаючи різні версії спільних об'єктів.
Ми використовували його для злому певних програм, змінивши існуючі функції за допомогою підготовлених спільних об'єктів.