4

只是为了好玩和咯咯笑,我试图在 delphi中创建一个64k 的介绍。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 包含 2 个线程变量,InOutRes(用于 IO 错误)和 RaiseListPtr。我不需要这两个成为我的应用程序中的线程变量,但它们似乎在整个 system.pas 中都有点硬连线。看起来像一个难以破解的坚果。

作为一种解决方法,我现在过早地终止我自己的进程使用

TerminateProcess( GetCurrentProcess, 0 )

以防止在正确关闭期间出现任何错误(在 Delphi 的 _Halt0 中更优雅的 ExitProcess 深处)。在构建后的步骤中,我从 PE 中删除 TLS 并使用 kkrunchy 打包。低至 8192 字节,没有问题。目前。在道德规范上,感觉我应该被关进监狱。:)

于 2011-02-01T08:22:44.380 回答