Я недавно натолкнулся на упоминание о нем на proggit, и (на данный момент) это не объясняется.
Я подозреваю, что это может быть так, но я точно не знаю.
Я недавно натолкнулся на упоминание о нем на proggit, и (на данный момент) это не объясняется.
Я подозреваю, что это может быть так, но я точно не знаю.
Ответы:
Если вы укажете 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
и free специально спроектированы в 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
путь, вы можете заставить загрузчик приложения загружать предоставленный общий объект сверх предоставленного по умолчанию.
Разработчики используют это для отладки своих приложений, предоставляя разные версии общих объектов.
Мы использовали его для взлома определенных приложений путем переопределения существующих функций с использованием подготовленных общих объектов.