12,964
回編集
124行目: | 124行目: | ||
([http://nixos.org/patchelf.html patchelf]を使用することで可能である)<br> | ([http://nixos.org/patchelf.html patchelf]を使用することで可能である)<br> | ||
<br> | <br> | ||
ソフトウェアを再リンクする場合、以下の方法がある。<br> | |||
* [http://nixos.org/patchelf.html patchelf]を使用する。<br>既にビルドされたELFのパスとインタプリタを変更することができる。 | |||
* ユーザがインストールしたGLIBCのld-linux.so.2を直接実行して、パラメータとしてソフトウェアのパスを渡す。<br>ソフトウェアを再ビルドすることなく、ld.-linux.so.2を置き換えることができる。 | |||
*: <code>/<GLIBCのインストールディレクトリ>/lib64/ld-linux.so.2 \</code> | |||
*: <code>--library-path /<GLIBCのインストールディレクトリ>/lib64:/<GLIBCのインストールディレクトリ>/usr/lib64 \</code> | |||
*: <code><ソフトウェアの実行ファイルのパス></code> | |||
* 適切なchroot環境を設定する。 | |||
* [http://bitwagon.com/rtldi/rtldi.html rtldi]とバイナリエディタを使用する。 | |||
<br> | |||
==== インストールしたGLIBCを使用してソフトウェアをビルドする場合 ==== | |||
リンカオプションの<code>rpath</code>オプションを指定して、ランタイムローダがGLIBCのインストールディレクトリにあるライブラリを検索する。<br> | |||
./configure --prefix=<インストールするソフトウェアのディレクトリ> \ | ./configure --prefix=<インストールするソフトウェアのディレクトリ> \ | ||
LDFLAGS="-Wl,-rpath <GLIBCのインストールディレクトリ>/lib64 -Wl,--dynamic-linker=<GLIBCのインストールディレクトリ>/lib64/ld-linux.so.2" | LDFLAGS="-Wl,-rpath <GLIBCのインストールディレクトリ>/lib64 -Wl,--dynamic-linker=<GLIBCのインストールディレクトリ>/lib64/ld-linux.so.2" | ||
<br> | <br> | ||
<code>dynamic-linker</code>オプションは、ld-linux.so.2へのパスをソフトウェアに焼き付ける設定である。<br> | <code>dynamic-linker</code>オプションは、ld-linux.so.2へのパスをソフトウェアに焼き付ける設定である。<br> | ||
(<code>dynamic-linker</code>オプションは、ELF実行ファイル用にコンパイルする場合にのみ動作する)<br> | (<code>dynamic-linker</code>オプションは、ELF実行ファイル用にコンパイルする場合にのみ動作する)<br> | ||
<br> | <br> | ||
==== patchelfを使用してソフトウェアを実行する場合 ==== | |||
まず、ソフトウェアの実行ファイルをバックアップする。(patchelfの実行後は、rpathに指定されているパスを復元できないため)<br> | |||
<br> | |||
以下に示すWebサイトから、patchelfをダウンロードする。<br> | |||
実行ファイルに対して、patchelfを実行する。<br> | |||
./patchelf -set-interpreter /<GLIBCのインストールディレクトリ>/ld-linux.so.2 -set-rpath \ | |||
/<GLIBCのインストールディレクトリ>/ <ソフトウェアの実行ファイルのパス> | |||
<br> | |||
新しく生成された実行ファイルを実行する。<br> | |||
./<ソフトウェアの実行ファイル> | |||
<br> | |||
Linuxにおいて、ソフトウェアを実行する場合、バイナリはリンカ、ライブラリの順に読み込む。<br> | |||
もし、リンカに問題があり、実行ファイルがどのパスを探しているのかを知りたい場合、以下のコマンドで確認することができる。<br> | |||
readelf -l <ソフトウェアの実行ファイルのパス> | grep interpreter | |||
<br> | |||
もし、ライブラリファイルに問題がある場合、実行ファイルが必要とするライブラリファイル群を確認する。<br> | |||
readelf -d <ソフトウェアの実行ファイルのパス> | grep Shared | |||
ldd <ソフトウェアの実行ファイルのパス> | |||
<br> | |||
patchelfは、上記2つの問題に関連して、ソフトウェアを実行する時に遭遇する様々な問題に対して動作する。<br> | |||
例えば、"ELF file OS ABI invalid"と表示される場合、新しいローダを設定する(コマンドの-set-interpreter部分)ことで解決する場合がある。<br> | |||
別の例では、ソフトウェアの実行時に"No such file or directory"と表示される場合、新しいインタプリタを設定することで解決する。<br> | |||
<br><br> | <br><br> | ||
__FORCETOC__ | __FORCETOC__ | ||
[[カテゴリ:CentOS]][[カテゴリ:SUSE]][[カテゴリ:Raspberry_Pi]] | [[カテゴリ:CentOS]][[カテゴリ:SUSE]][[カテゴリ:Raspberry_Pi]] |