Ошибка 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'
Другие вопросы по тегам