Я знаю, что это можно использовать readelf -d <elf> | grep RPATH
для проверки заданного двоичного файла из оболочки, но возможно ли это сделать в рамках процесса?
Что-то вроде (мой полностью выдуманный системный вызов):
/* get a copy of current rpath into buffer */
sys_get_current_rpath(&buffer);
Я пытаюсь диагностировать некоторые подозрительные проблемы с связыванием SO в нашей кодовой базе и хотел бы, если возможно, проверить RPATH таким образом (я бы предпочел не создавать внешний скрипт).
grep PATH
вместо этого. Компоновщик должен использовать RPATH или RUNPATH, и между ними есть тонкие, но важные различия: stackoverflow.com/a/52020177Ответы:
#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; }
источник
/proc
он смонтирован, то расширение$ORIGIN
выполняется так же просто, какreadlink("/proc/self/exe", ...)
и завершение NUL последней косой чертой.RPATH
, я хотел бы отметить, что не менее важно проверитьDT_RUNPATH
тег, если кто-то хочет знать пути, по которым двоичный файл может загружать свои общие библиотеки.Для записи вот пара команд, которые будут отображать
rpath
заголовок.Может быть, еще лучший способ сделать это:
Вторая команда также перечисляет прямые зависимости от других библиотек, за которыми следует
rpath
.источник
Вы также можете использовать:
источник
apt-get install -y chrpath
Вот что я использую для удобства в качестве функции оболочки:
Это потребляет
eu-readelf
вывод,elfutils
например:и излучает
Он также должен нормально работать с binutils
readelf
вместо elfutilseu-readelf
.источник