Я столкнулся с некоторыми проблемами при использовании LD_PRELOAD для загрузки файла so.
Шаги следующие:
libtest.c:
void fun() { return }
gcc -o libtest.so libtest.c -fPIC --shared
экспорт LD_PRELOAD=
pwd
/libtest.somain.c
extern void fun(); void main() { fun() }
gcc -о основной -L. main.c -ltest
Затем
ldd main
ldd main linux-vdso.so.1=>(0x00007ffff7ffd000) /home/shiyanlou/Code/libtest.so(0x00007ffff7df9000) libtest.so=>not found libc.so.6=>/lib/x86_64-linux-gnu/libc.so.6 (0x00007ffffa29000) /lib64/ld-linux-x86-64.so.2 (0x0000555555554000)
- выполнить основной
./main
он продвигает: ошибка при загрузке общей библиотеки: libtest.so. не удается открыть общий объектный файл: Нет такого файла или каталога.
Интересно, почему он подсказывает, что libtest.so не может быть найден после того, как я экспортировал переменную LD_PRELOAD. Однако я также пытался использовать LD_PRELOAD, чтобы указать другую общую библиотеку (не «libc.so») для внедрения функции malloc, это работает! Почему LD_PRELOAD работает только для общей библиотеки, которая не использовалась при линковке???