Что такое трюк LD_PRELOAD? - PullRequest
       67

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

303 голосов
/ 09 января 2009

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

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

Ответы [ 9 ]

363 голосов
/ 09 января 2009

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

$ LD_PRELOAD=/path/to/my/malloc.so /bin/ls
41 голосов
/ 09 января 2009

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

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

31 голосов
/ 09 января 2009

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

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

23 голосов
/ 09 декабря 2015

Как уже упоминалось, многие используют LD_PRELOAD для предварительной загрузки библиотеки. Кстати, вы можете CHECK , если настройка доступна по команде 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 голосов
/ 24 июля 2012

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

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

3 голосов
/ 04 февраля 2014

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

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

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

$ export LD_PRELOAD=
2 голосов
/ 11 августа 2014

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

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

1 голос
/ 31 мая 2015

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

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

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

0 голосов
/ 30 января 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...