1

UPX (実行可能ファイルから余分なバイトを絞り出すツール) は、buildappツールに組み込まれている圧縮よりもわずかなスペースを節約するため、これはほとんどばかげた質問です。

非常に小さなデモ アプリケーションでは、42 メガバイトのファイルが作成されます。SBCL 環境は小さくないので、理解できます。

--compress-coreオプションを に渡すと、buildappそれが 9.2MB に縮小されます。

結果のバイナリに UPX を投げてみようと思ったのですが、節約できるのはあと数バイトだけです。9994288 -> 9871360

ただし、結果のファイルはもう実行されません。SBCL REPL にジャンプするだけです (エラーなしで、sbcl手動で実行したかのようです)。

UPX は、この破損の原因となったバイナリに対して何を行いましたか?

4

1 に答える 1

1

これは答えではないかもしれませんが、手がかりとして役立つかもしれません: で作成された SBCL 実行可能ファイルの末尾に、1 バイトでも何かを追加すると、sb-ext:save-lisp-and-die説明したように、すべての定義が消えることがわかりました.

おそらく、SBCL はコア (定義を含む) を SBCL ELF (または Windows では PE) バイナリのコピーに追加し、最後にいくつかのメタデータを追加することで実行可能ファイルを作成します。実行可能ファイルに。

で作成された実行可能ファイルを 16 進編集するsave-lisp-and-dieと、文字列 "LCBS" (SBCL を逆方向) で終わることがわかります。これは私の理論を裏付けているようです。「LCBS」はおそらくマジック ナンバーとして機能し、この実行可能ファイルには独自のコアが含まれていることを SBCL に知らせます。

UPX は実行可能ファイルを圧縮し、おそらく最後にそのマジック ナンバーを含めます。SBCL がディスク上で UPX 圧縮された自己を開くと、最後に「LCBS」が見つからないため、実行可能ファイルにコアが追加されていないと想定します。

この場合、標準ライブラリがまだ存在しているように見える理由を説明できません。その場合、SBCL が読み込まれる可能性があります/usr/lib/sbcl/sbcl.core(または、Windows では同等のものが読み込まれます)。これは、実行可能ファイルを SBCL がインストールされていないマシンに移動し、それがまったく機能するかどうかを確認することでテストできcarます。cdrlist

于 2016-07-31T06:50:39.850 に答える