如何找到我的.exe文件的入口函数?

4

我很愚蠢地问这个问题,请您在评论“是main(),傻瓜”的之前先看一下症状。

我正在使用Visual Studio Express 2012开发一个项目。我们之前只为Win32(x86)平台构建过,但现在我要将.exe构建转换为64位。我现在有一个完全链接的.exe文件,但在此过程中发生了一件有趣的事情:入口点不再被调用。

这个(C++,控制台)程序的入口点是一个在文件范围内声明的C++函数,其签名如下:int main(int argc, char * argv[])。自从第一天起,这个函数就一直在x86可执行文件中正常工作。但在x64上没有被调用:

  • 链接器没有抱怨找不到入口点。
  • 加载器没有抱怨找不到入口点。
  • 当我从命令行运行exe时,它会立即启动并退出,退出代码为127。
  • 例如gdb,它说“在启动期间,程序以代码0xc000007b退出。”
  • 标准输出和标准错误输出都没有任何输出。
  • 如果我在main中放入诸如int * p(nullptr); *p = 5;之类的有趣的东西,程序不会崩溃(即使没有这个,我也确定main()没有运行)。

什么可能导致这个问题?如何调试它?由于我的代码从未运行过,所以我不确定在我的调试器中要设置断点的位置...


我在主函数中放了一些有趣的东西,比如 int * p(nullptr); *p = 5;,程序并没有崩溃。但这并不能证明什么。 - SingerOfTheFall
1
main 不是程序中第一个执行的代码。第一个要执行的代码是编译器生成的用于调用静态构造函数等的代码。在此之前运行的代码属于操作系统;它负责加载您的代码所依赖的库。这个错误似乎发生在操作系统代码中。 - user541686
3个回答

6

0xc000007b代表STATUS_INVALID_IMAGE_FORMAT。也就是说,操作系统甚至没有将二进制文件加载到足够远的位置以便开始执行。

可能是您的编译设置有问题。然而,通常当我看到这个错误时,问题出在64位应用程序尝试动态链接到32位DLL上。

检查您的库,并验证您的路径指向任何DLL的64位版本。


0

errlook实用程序显示127为“指定的过程未找到”。在<winerror.h>中搜索该文本,得到ERROR_PROC_NOT_FOUND

这听起来像是DLL问题。

现在我不喜欢将“入口点”应用于main,因为那么你应该如何称呼入口点,即您提供给链接器以设置入口点的地址?启动函数可能更好。这不仅仅是吹毛求疵:微软的技术作家已经混淆了自己,现在可以庆祝20年关于PE入口点的不正确和自相矛盾的文档。我认为他们永远不会弄对。

在我的经验中,gdb非常不可靠,不是检查是否被调用的好工具。它是不可靠的,至少当它将我检测为用户时。相反,在main中使用消息框或类似易于识别和保证的东西。


-1
你可以通过使用/ENTRY编译器标志来找到(并修改)可执行文件的入口点。

http://msdn.microsoft.com/en-us/library/f9t8842e.aspx

在Visual Studio开发环境中设置此链接器选项

  1. 打开项目的属性页对话框。有关详细信息,请参阅设置Visual C++项目属性。
  2. 单击链接器文件夹。
  3. 单击高级属性页。
  4. 修改入口点属性。

main和你使用/entry设置的机器代码级别入口点混淆起来并不是一个好主意,这对于微软的链接器来说尤其如此。我没有跟随你提供的链接,但很可能它指向微软错误和误导性的入口点文档,这已经持续了20多年。简单地不要相信它:使用适当的工具来检查事情。 - Cheers and hth. - Alf
由于他正在使用Visual Studio,我认为这些信息可能会有用,因为这是使用他们的编译器标志覆盖入口点的方法。但是,你说得对,它省略了很多细节。 - ben

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接