2011-01-29 16 views
4

私はdelphiで64k introを作成しようとしています。このサイズのアプリケーションに最適な実行可能なパッカーの1つは、Farbrauschのkkrunchyです。私は(そうでない場合は空の)Delphiの実行可能で、それを実行したときしかし、私は両方が犯人かもしれないDelphiの実行ファイルと推測している、と私は入れて本当の悩みを持っていない、次の出力kkrunchy - Delphi実行ファイルのtlsデータを取り除く方法を教えてください。

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

を取得しますどちらがどれであるか把握しようとしている汗をかいている時間と、実行ファイルやそれに類似するものを修正して投稿してみてください... はすでにを知っていますか、この問題を回避する方法についての情報はありますか?

+1

ええ、RaiseListPtrは例外処理に関連しており、スレッドごとに独自のraiseリストが必要なため、threadvarでなければなりません。これを変更する方法があるかどうかは不明です。 –

+0

私は本当にそれを変更する必要があるかどうかはまだ分かりません。私は例外と適切なIOエラー処理(この特定のアプリケーションのために)なしで暮らすことができます。 GetTLSがクラッシュする原因となっていることがわかりません... _after_ ExitProcessのようです。 –

+0

私の編集内容を別の回答に移動して、Q&A形式に合うようにしました(将来の参照を改善しました)。そしてMasonの回答を正しいものとしてマークしました。 –

答えて

3

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

+0

ありがとう、メイソン!それは間違いなくTLSです。私はDelphiが常にそれを事前に割り当てていることを覚えているようです(実際にはスレッドストレージ管理を手動で行います)。私はsystem.pasをブラウズし始めるでしょう。 –

1

(メーソンの答えに加えて、これは正しい)。

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

System.pasには、2つのスレッドバー、InOutRes(IOエラーの場合)、およびRaiseListPtrが含まれています。私はを必要としませんこれらの2つは私のアプリケーションではthreadvarsですが、system.pasを通してちょっとハードワイヤードに見えます。ひびの入った硬いナットのように見えます。

回避策として、私は今、途中で(深いDelphiの_Halt0からよりエレガントなのExitProcess内側)適切シャットダウン時にすべてのエラーを防ぐために

TerminateProcess(GetCurrentProcess, 0) 

を使用して独自のプロセスを終了します。ポストビルドのステップでは、PEからTLSを削除し、kkrunchyでパックします。ダウン8192バイト、問題はありません。今のところ。コード - 倫理的に、私はバーの後ろに置かなければならないように感じます。 :)

関連する問題