「インストール - GLIBC」の版間の差分

ナビゲーションに移動 検索に移動
124行目: 124行目:
([http://nixos.org/patchelf.html patchelf]を使用することで可能である)<br>
([http://nixos.org/patchelf.html patchelf]を使用することで可能である)<br>
<br>
<br>
新しくインストールしたGLIBCで動作するソフトウェアを使用する場合、以下のようにビルドする。<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>rpath</code>オプションは、ランタイムローダがGLIBCのインストールディレクトリにあるライブラリを検索する設定である。<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>
ソフトウェアを再リンクする場合、以下の方法がある。<br>
==== patchelfを使用してソフトウェアを実行する場合 ====
* 適切なchroot環境を設定する。
まず、ソフトウェアの実行ファイルをバックアップする。(patchelfの実行後は、rpathに指定されているパスを復元できないため)<br>
* [http://bitwagon.com/rtldi/rtldi.html rtldi]とバイナリエディタを使用する。
<br>
* [http://nixos.org/patchelf.html patchelf]を使用する。<br>既にビルドされたELFのパスとインタプリタを変更することができる。
以下に示すWebサイトから、patchelfをダウンロードする。<br>
* 新しいld-linux.so.2を直接実行して、パラメータとしてソフトウェアのパスを渡す。<br>ソフトウェアを再ビルドすることなく、ld.-linux.so.2を置き換えることができる。
実行ファイルに対して、patchelfを実行する。<br>
*: <code>/<GLIBCのインストールディレクトリ>/lib64/ld-linux.so.2 \</code>
./patchelf -set-interpreter /<GLIBCのインストールディレクトリ>/ld-linux.so.2 -set-rpath \
*: <code>--library-path <GLIBCのインストールディレクトリ>/lib64:/<GLIBCのインストールディレクトリ>/usr/lib64 \</code>
/<GLIBCのインストールディレクトリ>/ <ソフトウェアの実行ファイルのパス>
*: <code>/<ソフトウェアのインストールディレクトリ>/<ソフトウェアの実行ファイル></code>
<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]]

案内メニュー