ELF ファイルを適当に編集する方法
patchelf
を使うと一発。elfedit
というコマンドが binutils にあるっぽかったが、使い方がイマイチ分からなかった。
RPATH の追加
$ORIGIN/../lib
を追加する例。ちなみに $ORIGIN
はファイルがあるディレクトリを指すので、絶対パスを使うより柔軟にパスの指定ができる。
$ patchelf --add-rpath '$ORIGIN/../lib'
NEEDED の追加
$ patchelf --add-needed libhoge.so.0
RPATH と NEEDED を組み合わせると
LD_PRELOAD
的なことが環境変数なしでできる
下みたいな内容で適当なライブラリを作る。
int puts(const char *s) {
return 0;
}
で、下みたいな内容の実行ファイルに patchelf する。
#include <stdio.h>
int main(void) {
puts("hoge");
}
$ ./hoge
hoge
$ patchelf --add-rpath '$ORIGIN/lib'
$ patchelf --add-needed 'libhoge.so.0'
$ ./hoge
(何も出ない)
実用性があるかは謎。