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


83

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

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

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

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


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
Андреас Рот,


11
Этот ответ не имеет ничего общего с заданным вопросом (и содержится в самом вопросе).
Наемный русский


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.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.