【发布时间】:2012-01-05 21:25:26
【问题描述】:
当我刚刚声明时
boost::thread t1, t2;
在我的程序中,然后用UPX压缩.exe文件,压缩成功。但是当我尝试启动压缩的 exe 时,Windows 告诉我它是“无效的 win32 应用程序”。
有一个关于 UPX 的错误报告 (similar bug),但它有不同的错误消息(“应用程序未能正确初始化 (0xc0000005)”)。
在我的情况下,操作系统认为文件已损坏或其他原因,因此它甚至无法开始显示错误!为什么??
Win7x64、C++、VisualStudio、boost 1.47、UPX3.07
奇怪的消息:
解压 exe 会使损坏的 exe 引发完全相同的错误 作为here。 ("应用程序未能正确初始化 (0xc0000005)") 这是解压后的 exe,不像 bug 那样打包 报告。
extern "C" void tss_cleanup_implemented(void) {}在包含 boost 的线程头之前并不重要。这 结果是一样的。
main.cpp:
#include <boost/thread.hpp>
int main(int argc, char** argv)
{
boost::thread t;
return 0;
}
可能有人会尝试编译和压缩?
【问题讨论】:
-
那么,您的构建是否设置了 boost 以生成 32 位可执行文件,还是 64 位可执行文件? (Windows 上的 UPX 不支持 64 位二进制文件)sourceforge.net/tracker/…
-
尝试了另一个打包程序,它只是写“不支持 tls 回调”
-
解压缩是否可以让您恢复正常工作的 EXE?至于 TLS,据说 UPX 从 v3.06(2010 年 9 月)开始支持线程本地存储。但是,如果 UPX 中的问题与线程本地存储的处理有关,您可以通过在包含 boost 的线程标头之前放置
extern "C" void tss_cleanup_implemented(void) {}来解决它,如此旧错误报告中所述:svn.boost.org/trac/boost/ticket/1848 -
@HostileFork,我添加了一些信息
-
你是静态链接还是动态链接boost线程库?
标签: c++ visual-studio boost boost-thread upx