Что такое трюк LD_PRELOAD?
-
06-07-2019 - |
Решение
Если для LD_PRELOAD
указать путь к общему объекту, этот файл будет загружен перед любой другой библиотекой (включая среду выполнения C, libc.so). код>). Итак, чтобы запустить
ls
с вашей специальной реализацией malloc ()
, сделайте следующее:
$ LD_PRELOAD=/path/to/my/malloc.so /bin/ls
Другие советы
Вы можете переопределить символы в стандартных библиотеках, создав библиотеку с такими же символами и указав библиотеку в LD_PRELOAD
.
Некоторые люди используют его для указания библиотек в нестандартных местах, но LD_LIBRARY_PATH
лучше для этой цели.
Р>
С помощью LD_PRELOAD
вы можете отдавать приоритет библиотекам.
Например, вы можете написать библиотеку, которая реализует malloc
и free
. И загрузив их с помощью LD_PRELOAD
, вы будете выполнять malloc
и free
вместо стандартных.
Как уже упоминалось, многие используют 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/ разделяемой libraries.html р>
легко экспортировать mylib.so
в env:
$ export LD_PRELOAD=/path/mylib.so
$ ./mybin
для отключения:
$ export LD_PRELOAD=
Вот подробный пост в блоге о предварительной загрузке:
https://blog.cryptomilk.org/2014/07 / 21 / что-это-предзагрузка /
Используя путь LD_PRELOAD
, вы можете заставить загрузчик приложения загружать предоставленный общий объект сверх предоставленного по умолчанию.
Разработчики используют это для отладки своих приложений, предоставляя разные версии общих объектов.
Мы использовали его для взлома определенных приложений путем переопределения существующих функций с использованием подготовленных общих объектов.
когда используется LD_PRELOAD, этот файл будет загружен раньше других
$ export LD_PRELOAD = / path / lib
lib для предварительной загрузки, даже это можно использовать и в программах