readelf -d <elf> | grep RPATH
を使用してシェルから特定のバイナリを検査することは可能ですが、プロセス内でこれを行うことはできますか?
次のようなもの(私の完全に作成されたシステムコール):
/* get a copy of current rpath into buffer */
sys_get_current_rpath(&buffer);
私はコードベース内のリンクの問題をいくつかの疑わしいSOを診断しようとしていますが、可能であればこの方法でRPATHを検査したいと思います(外部スクリプトを作成する必要はありません)。
#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
2番目のコマンドは、rpath
が後に続く他のライブラリへの直接の依存関係もリストします。
以下も使用できます。
chrpath -l binary-or-library
github.com/NixOS/patchelfのコードを使用できるかもしれませんが、知る限りライブラリATMではありません。