Чи є спосіб перевірити поточний 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
Ніколя Capens

Відповіді:


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
Andreas Roth


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.