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

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

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

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

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

отключить:

$ export LD_PRELOAD=

Ответ 8

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

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

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

Ответ 9

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