Ошибка LD_PRELOAD в определенной папке
В системе Ubuntu 16.04 пытался использовать ld_preload со специально откомпилированным libpcap.so и запустить tcpdump.
компилирование libpcap (1.8.0)
./configure --prefix=`pwd`/inst
make install
затем при использовании этой команды tcpdump использует пользовательский libpcap
LD_PRELOAD=/home/user/tcpdump/inst/libpcap.so.1.8.0 /usr/sbin/tcpdump --version
вывод:
tcpdump version 4.7.4
libpcap version 1.8.0
OpenSSL 1.0.2g 1 Mar 2016
но затем, когда я перемещаю libpcap в другую папку, например /usr/local/lib, она больше не работает.
Я получаю следующую ошибку:
ERROR: ld.so: object '/usr/local/lib/libpcap.so.1.8.0' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored
насколько я могу судить, это какая-то проблема с разрешениями. Но я выбрал все, что мог придумать. Что мне не хватает?
Это должно дать вам представление о том, что может быть не так.
Редактировать: проблема кажется специфической для некоторых каталогов и самого tcpdump. выводить строку, когда LD_PRELOAD работает на /bin/true
LD_PRELOAD=/usr/local/lib/libpcap.so.1.8.0 strace -fF /bin/true 2>&1 | grep libp
open("/usr/local/lib/libpcap.so.1.8.0", O_RDONLY|O_CLOEXEC) = 3
Вот вывод strace на tcpdump
LD_PRELOAD=/usr/local/lib/libpcap.so.1.8.0 strace -fF /usr/sbin/tcpdump 2>&1 | grep libp
open("/usr/local/lib/libpcap.so.1.8.0", O_RDONLY|O_CLOEXEC) = -1 EACCES (Permission denied)
writev(2, [{"ERROR: ld.so: object '", 22}, {"/usr/local/lib/libpcap.so.1.8.0", 31}, {"' from ", 7}, {"LD_PRELOAD", 10}, {" cannot be preloaded (", 22}, {"cannot open shared object file", 30}, {"): ignored.\n", 12}], 7ERROR: ld.so: object '/usr/local/lib/libpcap.so.1.8.0' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
open("/usr/lib/x86_64-linux-gnu/libpcap.so.0.8", O_RDONLY|O_CLOEXEC) = 3
обе команды выполнялись как sudo
1 ответ
Это похоже на проблему с поиском файла (завивка или неправильный путь). Я вижу, что вы упоминаете, что вы переместили файл в / usr / local / lib, но я вижу сообщение об ошибке как /usr/local/libpcap.so.1.8.0. Возможно опечатка?
Если нет, пожалуйста, запустите
LD_PRELOAD=/usr/local/lib/libpcap.so.1.8.0 strace -fF -e open /bin/true 2>&1 | grep libp
Еще одно, что нужно подтвердить, это то, что / usr / local / lib находится в стандартном пути для вашего компоновщика (если вы не хотите использовать LD_PRELOAD, который есть):
ldconfig -v 2>/dev/null | grep -v ^$'\t'