为什么UPX打破了编译的SBCL应用程序?

时间:2016-07-22 05:21:33

标签: common-lisp sbcl upx

这主要是一个愚蠢的问题,因为UPX(一种从可执行文件中剔除多余字节的工具)在buildapp工具中为内置压缩节省了很小的空间。

一个非常小的演示应用程序创建一个42兆字节的文件。可以理解,因为SBCL环境并不小。

--compress-core选项传递给buildapp会将其缩小至9.2 MB。

我以为我会尝试在生成的二进制文件中抛出UPX,而节省的资金只会增加几个字节:9994288 -> 9871360

但是,生成的文件不再运行了 - 它只是跳转到SBCL REPL(没有错误,就好像我只是手动运行sbcl),并且有些人在那里探索构成我的测试程序的功能不再存在。

UPX对导致此次破坏的二进制文件做了什么?

1 个答案:

答案 0 :(得分:0)

这可能不是答案,但它可以作为一个线索:我发现如果你添加任何东西,甚至一个字节,到用sb-ext:save-lisp-and-die创建的SBCL可执行文件的末尾,那么所有正如你所描述的那样,定义消失了。

也许SBCL通过将核心(包含您的定义)附加到SBCL ELF(或Windows上的PE)二进制文件的副本以及最后的一些元数据来创建可执行文件,以便SBCL仍然可以找到核心的开头虽然它附加到可执行文件。

如果你对用save-lisp-and-die创建的可执行文件进行十六进制编辑,你会发现它以字符串“LCBS”(SBCL向后)结束,这似乎支持我的理论。 “LCBS”可能是一个神奇的数字,让SBCL知道是的,这个可执行文件包含它自己的核心。

UPX压缩可执行文件,可能包括最后的幻数。当SBCL在磁盘上打开其UPX压缩的self时,它最终将找不到“LCBS”,因此它假定可执行文件中没有附加核心。

我无法解释为什么标准库似乎仍然存在,如果是这种情况。在这种情况下,可能是SBCL加载/usr/lib/sbcl/sbcl.core(或在Windows上等效)。这可以通过将可执行文件移动到未安装SBCL的计算机并查看它是否正常工作来测试,如果是,您是否还有carcdrlist,等