Я хочу создать ссылку на разделяемую библиотеку, владелец которой изменен на root и установлен setuid:
$ ls -la
total 3616
drwxrwxr-x 2 chiron chiron 4096 Mai 29 21:59 .
drwxrwxr-x 4 chiron chiron 4096 Mai 29 23:16 ..
-rwsr-xr-x 1 root chiron 3692440 Mai 29 21:59 chiron_lowlevel_controller_node
Когда я запускаю исполняемый файл, я получаю следующую ошибку:
$ ./chiron_lowlevel_controller_node
./chiron_lowlevel_controller_node: error while loading shared libraries: libxmlrpcpp.so: cannot open shared object file: No such file or directory
Это смущает меня, потому что ldd возвращает:
$ ldd chiron_lowlevel_controller_node | grep xml
libxmlrpcpp.so => /opt/ros/melodic/lib/libxmlrpcpp.so (0x00007effe8c86000)
И libxmlrpcpp.so действительно существует:
$ ls -la | grep xml
-rw-r--r-- 1 root root 122608 Mär 18 19:03 libxmlrpcpp.so
Я также знаю, что libxmlrpcpp.so не поврежден или около того, потому что, когда я удаляю setuid и меняю владельца на chiron, ошибка не возникает.
Дополнительный вопрос:
$ readelf -d chiron_lowlevel_controller
возвращает много каталогов в RUNPATH:
0x000000000000001d (RUNPATH) Library runpath: [Many:Directories:Separated:By:Double:Dots]
Но если я переместу libxmlrpcpp.so в один из этих каталогов,
$ ldd chiron_lowlevel_controller_node | grep xml
libxmlrpcpp.so => not found
Эта статья утверждает, что ldd ищет во всех каталогах runpath общую библиотеку, так почему же это не работает, когда я перемещаю общую библиотеку? Или эта статья не так?
Системная информация:
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 18.04.2 LTS
Release: 18.04
Codename: bionic