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
(何も出ない)

実用性があるかは謎。