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