Недавно я встретил ссылку на proggit и (на данный момент) не объясняется.
Я подозреваю, что это может быть, но я точно не знаю.
Недавно я встретил ссылку на proggit и (на данный момент) не объясняется.
Я подозреваю, что это может быть, но я точно не знаю.
Если вы установите для LD_PRELOAD
путь к общему объекту, этот файл будет загружен до любой другой библиотеки (включая C runtime, 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
для предварительной загрузки библиотеки. BTW, вы можете ПРОВЕРИТЬ, если параметр доступен командой 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=
Вот подробное сообщение в блоге о предварительной загрузке:
Используя путь LD_PRELOAD
, вы можете заставить загрузчик приложений загружать предоставленный общий объект по предоставленному по умолчанию.
Разработчики используют это для отладки своих приложений, предоставляя разные версии общих объектов.
Мы использовали его для взлома некоторых приложений путем переопределения существующих функций с использованием готовых общих объектов.
когда используется LD_PRELOAD, этот файл будет загружен до того, как будет предварительно загружен любой другой $export LD_PRELOAD=/path/lib
lib, даже это можно использовать и в программах