Есть ли способ проверить текущий 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,

Вы также можете использовать:

chrpath -l binary-or-library

Вот что я использую для удобства в качестве функции оболочки:

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().

[1] https://man7.org/linux/man-pages/man3/dlinfo.3.html

Может быть, вы можете использовать код с github.com/NixOS/patchelf, но AFAIK это не банкомат библиотеки.

Другие вопросы по тегам