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

292 Hank Gay [2009-01-09 01:14:00]

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

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

c linux environment-variables


9 ответов


348 Решение JesperE [2009-01-09 01:20:00]

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

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

40 Joshua [2009-01-09 01:18:00]

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

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


30 Ronny Brendel [2009-01-09 01:19:00]

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

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


22 Patric [2015-12-09 09:20:00]

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

9 Rajesh [2012-07-24 12:41:00]

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

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


3 JulienGenoud [2014-02-04 13:03:00]

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

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

отключить:

$ export LD_PRELOAD=

2 asn [2014-08-11 13:11:00]

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

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


1 dnahc araknayirp [2015-05-31 06:16:00]

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

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

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


0 Sumith Senarathne [2019-01-30 19:29:00]

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