Вопрос

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

Как уже упоминалось, многие используют 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/ разделяемой libraries.html

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

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

для отключения:

$ export LD_PRELOAD=

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

https://blog.cryptomilk.org/2014/07 / 21 / что-это-предзагрузка /

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top