Есть ли способ проверить текущее рапуску на Linux?
Вопрос
Я знаю, что можно использовать readelf -d <elf> | grep RPATH
Чтобы проверить данный двоичный двоичный от оболочки, но возможно ли сделать это в процессе?
Что-то вроде (мой полностью составленный системный звонок):
/* get a copy of current rpath into buffer */
sys_get_current_rpath(&buffer);
Я пытаюсь диагностировать некоторые подозрительные, поэтому связывающие проблемы в нашей кодовой базе, и хотели бы осмотреть тьму так, если это возможно (я бы скорее не придется вызывать внешний скрипт).
Решение
#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
.
Вы также можете использовать:
chrpath -l binary-or-library
Не связан с StackOverflow