8

特定のバージョンのシステム ライブラリにリンクされている既存の独自の ELF バイナリを移植可能にする方法を探しています。ポータブルとは、必ずしもライブラリのソース コードがなくても、同じプロセッサ アーキテクチャと互換性のあるシステム カーネルを備えたすべてのシステムで実行可能ファイルを動作させることを意味します (ソース コードがなくても仕方がない場合は、それも問題ありません)。 .

これまでのところ、2 つの可能性を考えましたが、それらが可能かどうか、可能であればどちらを選択するかはわかりません。

  1. リンクされたすべてのライブラリとその依存関係を検索し、それらをバイナリのサブディレクトリに含め、Library-Path をそのディレクトリに変更します。
  2. ライブラリをバイナリ ファイルに静的に再リンクして、1 つの大きな実行可能ファイルにします (プログラムがチェックサムに基づいて自身を検証しない場合)。

私は作成した移植可能なプログラムを配布したくないので、ライセンスは問題ではありません。これは私的使用のみです。

回答ありがとうございます。

4

1 に答える 1

6

リンクされたすべてのライブラリとその依存関係を検索し、それらをバイナリのサブディレクトリに含め、Library-Path をそのディレクトリに変更します。

これはほとんどの共有ライブラリで機能しますが、libc.so.6機能しません (ターゲット システムに十分な新しいバージョンがない場合に問題が発生する可能性が最も高いライブラリ)。

理由: glibc は 200 を超える個別の共有ライブラリで構成されており、それらの間にバージョン管理されていないバイナリ インターフェイスがあり、それらの間に安定した ABI がありません。このため、 glibc のすべての部分は同じビルドから取得する必要があります。これらの部品の 1 つですlibc.so.6。もう一つはld-linux.so。後者への絶対パスは、すべての動的実行可能ファイルにハードコードされています。最終結果: の独自のコピーを提供libc.so.6し、そのコピーがシステムに存在するものと一致しない場合、/lib/ld-linux*.so.2非常に奇妙なクラッシュが発生し、説明やデバッグが非常に困難になります。

ライブラリをバイナリ ファイルに静的に再リンクして、1 つの大きな実行可能ファイルにします。

これは、AIX 以外の UNIX システムでは機能しません。それらはすべて、最終的なa.outリンク製品であると考えており、これ以上リンクすることはできません。foo.so

動的実行可能ファイルから (巨大な) 静的実行可能ファイルを作成するstatifierが存在します。私はそれを使用した経験がありません。

于 2013-03-18T02:16:33.513 に答える