it-swarm.com.ru

Что такое трюк LD_PRELOAD?

Недавно я обнаружил ссылку на него в proggit , и (на данный момент) это не объясняется.

Я подозреваю, что это может быть this , но я точно не знаю.

293
Hank Gay

Если для LD_PRELOAD указать путь к общему объекту, этот файл будет загружен перед любой другой библиотекой (включая среду выполнения C, libc.so). Итак, чтобы запустить ls с вашей специальной реализацией malloc(), сделайте следующее:

$ LD_PRELOAD=/path/to/my/malloc.so /bin/ls
350
JesperE

Вы можете переопределить символы в стандартных библиотеках, создав библиотеку с такими же символами и указав библиотеку в LD_PRELOAD.

Некоторые люди используют его для указания библиотек в нестандартных местах, но для этой цели лучше использовать LD_LIBRARY_PATH .

40
Joshua

С LD_PRELOAD вы можете отдавать приоритет библиотекам.

Например, вы можете написать библиотеку, которая реализует malloc и free. И загрузив их с помощью LD_PRELOAD, ваши malloc и free будут выполнены, а не стандартные.

31
Ronny Brendel

Как уже упоминалось, многие используют 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)
    ...
22
Patric

LD_PRELOAD перечисляет общие библиотеки с функциями, которые переопределяют стандартный набор, как /etc/ld.so.preload. Они реализованы загрузчиком /lib/ld-linux.so. Если вы хотите переопределить только несколько выбранных функций, вы можете сделать это, создав переопределяющий объектный файл и установив LD_PRELOAD; функции в этом объектном файле будут переопределять только те функции, которые оставят другие такими, какими они были.

Для получения дополнительной информации о разделяемых библиотеках посетите http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html

9
Rajesh

легко экспортировать mylib.so в env:

$ export LD_PRELOAD=/path/mylib.so
$ ./mybin

отключить :

$ export LD_PRELOAD=
3
JulienGenoud

Вот подробный пост в блоге о предварительной загрузке:

https://blog.cryptomilk.org/2014/07/21/what-is-preloading/

2
asn

Используя путь LD_PRELOAD, вы можете заставить загрузчик приложения загружать предоставленный общий объект сверх предоставленного по умолчанию.

Разработчики используют это для отладки своих приложений, предоставляя разные версии общих объектов.

Мы использовали его для взлома определенных приложений путем переопределения существующих функций с использованием подготовленных общих объектов.

1
dnahc araknayirp

когда используется LD_PRELOAD, этот файл будет загружен до того, как будет загружена любая другая $export LD_PRELOAD=/path/lib lib, даже это может быть использовано и в программах

0
Sumith Senarathne