Я недавно натолкнулся на упоминание о нем на proggit, и (на данный момент) это не объясняется.
Я подозреваю, что это может быть так, но я точно не знаю.
Я недавно натолкнулся на упоминание о нем на proggit, и (на данный момент) это не объясняется.
Я подозреваю, что это может быть так, но я точно не знаю.
Ответы:
Если вы укажете LD_PRELOADпуть к общему объекту, этот файл будет загружен до любой другой библиотеки (включая среду выполнения C libc.so). Итак, чтобы запустить lsвашу специальную malloc()реализацию, сделайте это:
$ LD_PRELOAD=/path/to/my/malloc.so /bin/ls
LD_PRELOAD. Причина в том, что, будучи переменной среды, она наследуется дочерними процессами, которые могут иметь рабочий каталог, отличный от родительского процесса. Таким образом, любой относительный путь не сможет найти библиотеку для предварительной загрузки.
Вы можете переопределить символы в стандартных библиотеках, создав библиотеку с такими же символами и указав библиотеку в LD_PRELOAD.
Некоторые люди используют его для указания библиотек в нестандартных местах, но LD_LIBRARY_PATHдля этого лучше.
С LD_PRELOADпомощью библиотеки вы можете отдавать приоритет.
Например, вы можете написать библиотеку, которая реализует mallocи free. И, загрузив их с LD_PRELOADвашими mallocи freeбудут выполнены, а не стандартные.
calloc? разве это не все испортит?
mallocи free специально спроектированы в glibc, чтобы позволить этому, и акции callocудается назвать ваши импортированные malloc. Не пытайтесь делать это с любыми другими функциями. Это не будет работать так хорошо.
Как уже упоминалось, многие используют 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/shared-libraries.html
Вот подробный пост в блоге о предварительной загрузке:
это легко экспортировать mylib.soв env:
$ export LD_PRELOAD=/path/mylib.so
$ ./mybin
отключить :
$ export LD_PRELOAD=
unset LD_PRELOAD
когда используется LD_PRELOAD, этот файл будет загружен до того, как будет загружена любая другая
$export LD_PRELOAD=/path/libбиблиотека, даже это может быть использовано и в программах
С помощью LD_PRELOAD путь, вы можете заставить загрузчик приложения загружать предоставленный общий объект сверх предоставленного по умолчанию.
Разработчики используют это для отладки своих приложений, предоставляя разные версии общих объектов.
Мы использовали его для взлома определенных приложений путем переопределения существующих функций с использованием подготовленных общих объектов.