📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

112行目: 112行目:
しかし、GLIBCは多くのモジュールから(200以上の共有ライブラリ)から構成されており、それらが全て一致する必要がある。<br>
しかし、GLIBCは多くのモジュールから(200以上の共有ライブラリ)から構成されており、それらが全て一致する必要がある。<br>
<br>
<br>
その1つが、ld-linux.so.2ライブラリであり、libc.so.6ライブラリと一致しなければ、エラーが発生する。<br>
例えば、ld-linux-x86-64.so.2ライブラリはlibc.so.6ライブラリと一致しなければ、エラーが発生する。<br>
ld-linux.so.2ライブラリへの絶対パスは、リンク時に実行ファイルにハードコードされており、リンク後は簡単に変更できない。
ld-linux-x86-64.so.2ライブラリへの絶対パスは、リンク時に実行ファイルにハードコードされており、リンク後は簡単に変更できない。
([http://nixos.org/patchelf.html patchelf]を使用することで可能である)<br>
([http://nixos.org/patchelf.html patchelf]を使用することで可能である)<br>
<br>
<br>
ソフトウェアを再リンクする場合、以下の方法がある。<br>
ソフトウェアを再リンクする場合、以下の方法がある。<br>
* [http://nixos.org/patchelf.html patchelf]を使用する。<br>既にビルドされたELFのパスとインタプリタを変更することができる。
* [http://nixos.org/patchelf.html patchelf]を使用する。<br>既にビルドされたELFのパスとインタプリタを変更することができる。
* ユーザがインストールしたGLIBCのld-linux.so.2を直接実行して、パラメータとしてソフトウェアのパスを渡す。<br>ソフトウェアを再ビルドすることなく、ld.-linux.so.2を置き換えることができる。
* 個別にインストールしたGLIBCのld-linux-x86-64.so.2ライブラリを直接実行して、パラメータとしてソフトウェアのパスを渡す。<br>ソフトウェアを再ビルドすることなく、ld-linux-x86-64.so.2ライブラリを置き換えることができる。
*: <code>/<GLIBCのインストールディレクトリ>/lib64/ld-linux.so.2 \</code>
*: <code>/<GLIBCのインストールディレクトリ>/lib/ld-linux-x86-64.so.2 \</code>
*: <code>--library-path /<GLIBCのインストールディレクトリ>/lib64:/<GLIBCのインストールディレクトリ>/usr/lib64 \</code>
*: <code>--library-path /<GLIBCのインストールディレクトリ>/lib64:/<GLIBCのインストールディレクトリ>/lib \</code>
*: <code><ソフトウェアの実行ファイルのパス></code>
*: <code><ソフトウェアの実行ファイルのパス></code>
* 適切なchroot環境を設定する。
* 適切なchroot環境を設定する。
128行目: 128行目:
リンカオプションの<code>rpath</code>オプションを指定して、ランタイムローダがGLIBCのインストールディレクトリにあるライブラリを検索する。<br>
リンカオプションの<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のインストールディレクトリ>/lib -Wl,--dynamic-linker=<GLIBCのインストールディレクトリ>/lib/ld-linux-x86-64.so.2"
<br>
<br>
<code>dynamic-linker</code>オプションは、ld-linux.so.2へのパスをソフトウェアに焼き付ける設定である。<br>
<code>dynamic-linker</code>オプションは、ld-linux-x86-64.so.2ライブラリへのパスをソフトウェアの実行ファイルに焼き付ける設定である。<br>
(<code>dynamic-linker</code>オプションは、ELF実行ファイル用にコンパイルする場合にのみ動作する)<br>
(<code>dynamic-linker</code>オプションは、ELF実行ファイル用にコンパイルする場合にのみ動作する)<br>
<br>
<br>
141行目: 141行目:
<br>
<br>
実行ファイルに対して、patchelfを実行する。<br>
実行ファイルに対して、patchelfを実行する。<br>
  ./patchelf -set-interpreter /<GLIBCのインストールディレクトリ>/ld-linux.so.2 -set-rpath \
  ./patchelf -set-interpreter /<GLIBCのインストールディレクトリ>/lib/ld-linux-x86-64.so.2 \
/<GLIBCのインストールディレクトリ>/ <ソフトウェアの実行ファイルのパス>
-set-rpath /<GLIBCのインストールディレクトリ>/ <ソフトウェアの実行ファイルのパス>
<br>
<br>
新しく生成された実行ファイルを実行する。<br>
新しく生成された実行ファイルを実行する。<br>
  ./<ソフトウェアの実行ファイル>
  ./<ソフトウェアの実行ファイル>
<br>
<br>
Linuxにおいて、ソフトウェアを実行する場合、バイナリはリンカ、ライブラリの順に読み込む。<br>
Linux上でソフトウェアを実行する場合、実行ファイルは①リンカ、②ライブラリの順に読み込む。<br>
もし、リンカに問題があり、実行ファイルがどのパスを探しているのかを知りたい場合、以下のコマンドで確認することができる。<br>
もし、リンカに問題がある時、実行ファイルがどのパスを探しているのかを知りたい場合、以下のコマンドで確認することができる。<br>
  readelf -l <ソフトウェアの実行ファイルのパス> | grep interpreter
  readelf -l <ソフトウェアの実行ファイルのパス> | grep interpreter
<br>
<br>
157行目: 157行目:
patchelfは、上記2つの問題に関連して、ソフトウェアを実行する時に遭遇する様々な問題に対して動作する。<br>
patchelfは、上記2つの問題に関連して、ソフトウェアを実行する時に遭遇する様々な問題に対して動作する。<br>
例えば、"ELF file OS ABI invalid"と表示される場合、新しいローダを設定する(コマンドの-set-interpreter部分)ことで解決する場合がある。<br>
例えば、"ELF file OS ABI invalid"と表示される場合、新しいローダを設定する(コマンドの-set-interpreter部分)ことで解決する場合がある。<br>
別の例では、ソフトウェアの実行時に"No such file or directory"と表示される場合、新しいインタプリタを設定することで解決する。<br>
また、ソフトウェアの実行時に"No such file or directory"と表示される場合、新しいインタプリタを設定することで解決する。<br>
<br><br>
<br><br>


__FORCETOC__
__FORCETOC__
[[カテゴリ:CentOS]][[カテゴリ:SUSE]][[カテゴリ:Raspberry_Pi]]
[[カテゴリ:CentOS]][[カテゴリ:SUSE]][[カテゴリ:Raspberry_Pi]]