web-dev-qa-db-ja.com

ソースコードが利用できない動的実行可能ファイルから静的ファイルを作成するオープンソースの方法はありますか?

例で問題を説明しましょう。例えば xfigpdfedit のように、日々の仕事で古いプログラムを使用しています。

現在、これらのプログラムは非常に古く、あまり頻繁に更新されません。私の恐怖は、いつか何らかのライブラリや互換性のないアップデートがないために、もう機能しないことです。

プログラムのコンパイルが簡単な場合now、実行中のシステムでは、解決策が便利です。ソースを少しハッキングして静的にコンパイルしてみてください---結果の実行可能ファイルは大きくてそれほど効率的ではありませんが、予測可能なfuture(1)で機能します。これはxfigの場合のようで、できるだけ早く試してみます。

しかし、たとえば、pdfeditはQt3に依存しており、システムをセットアップしてコンパイルするのは現時点では非常に複雑です。幸いなことに 実行可能 必要なライブラリが他のものと競合しないという事実のおかげです。しかし、これは将来変更される可能性があるため、この問題を解決したいと思います。

Ubuntu上に動的なライブラリとすべてのライブラリがあるがソースコードがない場合、静的なバイナリ(または同様のもの)を作成するにはどうすればよいですか?

周りを検索しました。可能性の1つは statifier (2)ですが、多くの アドレスのランダム化の問題 があるため、これはノーです。非フリー版の Ermine は機能しているようですが、私は本当にオープンソースのオプションを好むでしょう。

もう1つの可能性は、dockerまたは同様のパッケージングシステムを使用することです。しかし、すべての 私が見つけたチュートリアルはかなりRedHat指向です ;そして、正直なところ、従うのは非常に複雑です。


脚注

(1)それほどクレイジーではありません。 static ffmpeg を使用します。たとえば、正常に動作し、互換性の問題はありません...

(2)statifierをコンパイルするには、 https://stackoverflow.com/questions/23498237/compile-program-for-32bit-on-64bit-linux-os-causes-fatal-errorを参照

20
Rmano

別のより簡単な方法で問題を解決できます。

実行可能ファイルでlddを使用して、リンクされたライブラリを表示します。次に例を示します。

$ ldd /bin/bash
linux-vdso.so.1 =>  (0x00007fffb2fd4000)
libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007fac9ef91000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fac9ed8d000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fac9e9c6000)
/lib64/ld-linux-x86-64.so.2 (0x00007fac9f1e1000)

次に、フォルダー内のすべてのライブラリーを収集し、このフォルダーを指すようにプログラムを実行する前にLD_LIBRARY_PATH環境変数を設定します。

$ LD_LIBRARY_PATH="/opt/my_program/lib" /opt/my_program/start

または、libフォルダのエントリを/etc/ld.so.conf.d/に追加できます。しかし、それはシステム全体に変更を適用します。

19
Klaus D.

statifier に関する1つの提案:

アドレス空間レイアウトのランダム化(ASLR)が原因で失敗する場合は、マシン全体で無効にする必要はありません。そのプロセスのためだけにオフにすることができます:

$ setarch `uname -m` -R statified_pdfedit [args...]

このコマンドは、ランダム化されたレイアウトを無効にして実行されます(ルートである必要はありません)。

2
lemonsqueeze