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

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

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

9 ответов

Решение

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

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

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

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

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

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

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

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

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

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

отключить:

$ export LD_PRELOAD=

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

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

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

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

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

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

Другие вопросы по тегам