OK、ここにもう少し長い説明がありますが、注意して進めてください。組み込みデバイスで使用可能な環境と一致するようにchroot環境をセットアップし、ビルドプロセスの最終段階で使用することを強くお勧めします。
動的にリンクされたELF実行可能ファイルがどのようにロードおよび実行されるかを理解する必要があります。ダイナミックリンカとも呼ばれるランタイムリンクエディタ(RTLD)と呼ばれるものがあり、必要なすべてのダイナミックリンクライブラリのロード、再配置の修正などを処理します。ダイナミックリンカの名前は、/lib/ld-linux.so.2
32ビットLinuxシステムとglibc2
64/lib64/ld-linux-x86-64.so.2
ビットLinuxシステムにあり
glibc2
ます。ダイナミックリンカはライブラリに非常に緊密に結合されておりglibc2
、通常はそのライブラリの一致するバージョンのみを処理できます。また、そのパスはリンカーによって実行可能ファイルにハードコードされています(通常はld
、リンクを実行するためにコンパイラによって暗黙的に呼び出されます)。最後のステートメントの有効性は、次のようにするだけで簡単に確認できますldd some_elf_executable
。ランタイムリンクエディタがフルパスで表示されます。
$ ldd some_elf_executable
linux-vdso.so.1 => (0x00007fffab59e000)
libm.so.6 => /lib64/libm.so.6 (0x0000003648400000)
libc.so.6 => /lib64/libc.so.6 (0x0000003648800000)
/lib64/ld-linux-x86-64.so.2 (0x0000003648000000) <--- the RTLD
glibc2
実行可能ファイルが実行されるシステムにインストールされているものとは異なるバージョンを使用する動的にリンクされた実行可能ファイルを生成するには、次のオプションのセットを使用してコードをリンクする必要がありld
ます。
-rpath=/path/to/newer/libs
/path/to/newer/libs
-これは、ライブラリの依存関係を解決しようとするときに最初に検索するようにダイナミックリンカに指示します。組み込みデバイスに/path/to/newer/libs
新しいバージョンをコピーしたパスと一致する必要がありますglibc2
-rpath-link=/path/to/newer/libs
-このオプションは、リンク時に共有ライブラリ間の依存関係を解決するときに使用するようにリンカー(ダイナミックリンカーではない)に指示します/path/to/newer/libs
-これは通常、あなたの場合は必要ありません。
--dynamic-linker=/path/to/newer/libs/ld-linux.so.2
-これは、実行可能ファイルに埋め込まれるRTLDへのパスをオーバーライドします
これらのオプションを提供する方法ld
は、通常-Wl
、GCCのオプションを使用することです。
-rpath=/path/to/newer/libs
になります:
-Wl,-rpath,/path/to/newer/libs
=
(に置き換えられていることに注意してください,
)
--dynamic-linker=/path/to/newer/libs/ld-linux.so.2
になります:
-Wl,--dynamic-linker,/path/to/newer/libs/ld-linux.so.2
/lib/ld-linux.so.2
開発システムから/path/to/newer/libs/
組み込みデバイスにコピーする必要があります。また、実行可能ファイルによって使用される、または間接的にロードされる可能性のlibc.so.6
ある数学ライブラリおよびその他すべてのライブラリをコピーする必要があります。とは、実際には。のような名前を持つ実際のライブラリへのシンボリックリンクであることにlibm.so.6
注意してください。これらのライブラリファイルをコピーし、適切なシンボリックリンクを作成して、みんなを幸せにする必要があります。libc.so.6
libm.so.6
libc-2.<version>.so