Есть ли способ проверить текущий rpath в Linux?
Я знаю, что можно использовать readelf -d <elf> | grep RPATH
проверить данный двоичный файл из оболочки, но возможно ли это сделать в процессе?
Что-то вроде (мой полностью составленный системный вызов):
/* get a copy of current rpath into buffer */
sys_get_current_rpath(&buffer);
Я пытаюсь диагностировать некоторые подозрительные проблемы со связыванием в нашей кодовой базе и хотел бы проверить RPATH таким образом, если это возможно (я бы предпочел не создавать внешний скрипт).
6 ответов
#include <stdio.h>
#include <elf.h>
#include <link.h>
int main()
{
const ElfW(Dyn) *dyn = _DYNAMIC;
const ElfW(Dyn) *rpath = NULL;
const char *strtab = NULL;
for (; dyn->d_tag != DT_NULL; ++dyn) {
if (dyn->d_tag == DT_RPATH) {
rpath = dyn;
} else if (dyn->d_tag == DT_STRTAB) {
strtab = (const char *)dyn->d_un.d_val;
}
}
if (strtab != NULL && rpath != NULL) {
printf("RPATH: %s\n", strtab + rpath->d_un.d_val);
}
return 0;
}
Для записи вот пара команд, которые покажут rpath
заголовок.
objdump -x binary-or-library |grep RPATH
Может быть, еще лучший способ сделать это заключается в следующем:
readelf -d binary-or-library |head -20
Вторая команда также перечисляет прямые зависимости от других библиотек, за которыми следует rpath
,
Вот что я использую для удобства в качестве функции оболочки:
function getrpath {
eu-readelf -d "${1:?}" | sed -e '/RUNPATH/{s~.*\[\(.*\)\]~\1~;n};d'
}
Это потребляет eu-readelf
выход из elfutils
нравиться:
Type Value
NEEDED Shared library: [libpq.so.5]
NEEDED Shared library: [libc.so.6]
RUNPATH Library runpath: [/some/path/to/lib]
....
и излучает
/some/path/to/lib
Он должен нормально работать с binutils readelf
вместо elfutils eu-readelf
тоже.
Есть выход. Следуйте примеру кода в
man dlinfo
[1], но используйте
NULL
как первый параметр
dlopen()
.
Может быть, вы можете использовать код с github.com/NixOS/patchelf, но AFAIK это не банкомат библиотеки.