Есть ли способ проверить текущий rpath в Linux?

83

Я знаю, что это можно использовать readelf -d <elf> | grep RPATHдля проверки заданного двоичного файла из оболочки, но возможно ли это сделать в рамках процесса?

Что-то вроде (мой полностью выдуманный системный вызов):

  /* get a copy of current rpath into buffer */
  sys_get_current_rpath(&buffer);

Я пытаюсь диагностировать некоторые подозрительные проблемы с связыванием SO в нашей кодовой базе и хотел бы, если возможно, проверить RPATH таким образом (я бы предпочел не создавать внешний скрипт).

Justicle
источник
1
Имейте в виду, что при диагностике проблем с разделяемой библиотекой вы также должны проверять тег RUNPATH. Таким образом, вы должны grep PATHвместо этого. Компоновщик должен использовать RPATH или RUNPATH, и между ними есть тонкие, но важные различия: stackoverflow.com/a/52020177
Николас Капенс

Ответы:

54
Занятые русские
источник
1
это замечательно, но он не работает с $ ORIGIN. $ ORIGIN не интерпретируется и возвращается функцией как есть. Есть ли способ добавить интерпретацию $ ORIGIN?
Жером
5
@ Jérôme Если вы выполняете в среде, где /procон смонтирован, то расширение $ORIGINвыполняется так же просто, как readlink("/proc/self/exe", ...)и завершение NUL последней косой чертой.
Занятый россиянин
Хотя вопрос был конкретно о RPATH, я хотел бы отметить, что не менее важно проверить DT_RUNPATHтег, если кто-то хочет знать пути, по которым двоичный файл может загружать свои общие библиотеки.
Николас Капенс
155

Для записи вот пара команд, которые будут отображать rpathзаголовок.

objdump -x binary-or-library |grep RPATH

Может быть, еще лучший способ сделать это:

readelf -d binary-or-library |head -20

Вторая команда также перечисляет прямые зависимости от других библиотек, за которыми следует rpath.

Майкл Диллон
источник
7
В ubuntu 15.04 я должен использовать: objdump -x binary-or-library | grep RUNPATH
Андреас Рот,
5
RPATH = RUNPATH см! Stackoverflow.com/questions/7967848/use-rpath-but-not-runpath & blog.qt.io/blog/2011/10/28/rpath-and-runpath
Фернандо Гонсалес Санчес
11
Этот ответ не имеет ничего общего с заданным вопросом (и содержится в самом вопросе).
Наемный русский
12

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

chrpath -l binary-or-library
Оскар Андреассон
источник
На ubuntu:apt-get install -y chrpath
Тоби Брулл
1

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

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.

Крэйг Рингер
источник