4

楽しみと笑いのためだけに、デルファイで64kのイントロを作成しようとしています。このサイズのアプリケーションに最適な実行可能パッカーの1つは、Farbrauschによるkkrunchyです。ただし、(それ以外の場合は空の)Delphi実行可能ファイルで実行すると、次の出力が得られます。

 - ERROR: files with exports or tls data are not supported

Delphiの実行可能ファイルの両方が原因である可能性があると推測しています。どちらが原因であるかを把握し、実行可能ファイルなどを変更した後、汗をかいて時間を費やしても問題はありません。この問題を回避する方法を知っている、またはいくつかの情報さえありますか?

4

2 に答える 2

3

エクスポートはDLL用です。EXEがエクスポートを実行している可能性は低いです。一方、TLSはスレッドローカルストレージです。どこかでthreadvar変数が宣言されている場合は、それが原因である可能性があります。また、TLSは組み込みの例外処理で使用されていると思いますが、すべての詳細については明確ではありません。それだけの場合は、このパッカーをまったく使用できない可能性があります。

于 2011-01-29T20:54:00.627 に答える
1

(メイソンの答えに加えて、それは正しいです)。

PEビューア/エディタを起動しましたが、エクスポートがないことを確認できます。だから今問題は:なぜスレッドのないアプリケーションにTLSが割り当てられているのですか、そしてそれについて私は何をしますか?シャットダウン時のアプリケーションエラーを除いて、PEテーブルから削除するとうまく機能します。

System.pasには、InOutRes(IOエラー用)とRaiseListPtrの2つのスレッド変数が含まれています。私のアプリケーションでは、これら2つをthreadvarsにする必要はありませんが、system.pas全体にハードワイヤードされているように見えます。割れにくいナットのように見えます。

回避策として、次を使用して自分のプロセスを途中で終了するようになりました

TerminateProcess( GetCurrentProcess, 0 )

適切なシャットダウン中のエラーを防ぐため(Delphiの_Halt0からのよりエレガントなExitProcessの奥深く)。ビルド後の手順で、PEからTLSを削除し、kkrunchyをパックします。8192バイトまで、問題ありません。今のところ。コード倫理的には、私はバーの後ろに置かれるべきだと感じています。:)

于 2011-02-01T08:22:44.380 に答える