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


20

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

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

プログラムをコンパイルすることは容易であれば、今、実行しているシステムでは、溶液は便利です:ビットにソースをハックして生成される実行可能ファイルが大きいので、効率的ではないだろうが、それがために動作します---静的にコンパイルしよう近い将来(1)。これが当てはまるようxfigで、できるだけ早く試してみます。

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

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

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

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


脚注

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

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

回答:


19

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

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/。しかし、それはシステム全体に変更を適用します。


これは良いアイデアです---私は本当にこれらすべてを実行可能ファイルにパッケージ化する方法を見つけたいと思いますが このソリューションは、ローダーの変更の影響を受ける可能性があります(ただし、後方互換性のない方法で誰もそのようなことをしないことを望みます)。より良い解決策が得られない場合、賞金を授与します---ありがとう。
Rmano

これを小さなインストールスクリプトに追加して、ローカルパスにリンクできます。私はこのソリューションが好きで、かつて使用できたかもしれません。
WalyKu

1
@Klaus、linux-vdso.so.1 どこにも見当たりません。カーネルにあると思いますか?
Rmano

1
はい。From man 7 vdso:「 "vDSO"(仮想動的共有オブジェクト)は、カーネルがすべてのユーザー空間アプリケーションのアドレス空間に自動的にマップする小さな共有ライブラリです。」
クラウスD. 14年

これは質問に対する厳密な回答ではありませんが、合理的な回避策です。ありがとう。
Rmano 14年

2

修飾子に関する1つの提案:

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

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

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


わあ、面白い。今、私はコンパイルすることができればstatifier...
Rmano

コンパイルおよびチェック。xfig_statifiedそれでもコアダンプ...残念。とにかくありがとう。
Rmano

うん、残念。私はそれが64ビットの問題ではないかどうか疑問に思っています、多分32ビットのセットアップでstatifierを実行してみてください?
レモンスクイーズ

32ビットマシンでチェックしましたが、コアダンプのままです。
Rmano 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.