繁体   English   中英

如何找出.exe的入口点功能?

[英]How do I find out my .exe's entry-point function?

我问这个问题非常愚蠢,但是请在评论“它是main() ,duh”之前忍受并阅读症状。

我正在Visual Studio Express 2012中的一个项目上。到目前为止,我们仅针对Win32(x86)平台进行了构建,但是我正在将.exe构建转换为64位。 我现在有一个完全链接的.exe,但是在此过程中发生了一件有趣的事情:不再调用入口点。

(C ++控制台)程序的入口点是在文件范围内声明的具有以下签名的C ++函数: int main(int argc, char * argv[]) 从第1天开始,该函数在x86可执行文件中就很愉快了。在x64上没有调用此函数:

  • 链接器没有抱怨它找不到入口点。
  • 加载程序不会抱怨找不到入口点。
  • 当我从命令行运行exe时,它会启动并立即以退出代码127退出。
  • gdb 例如说:“在启动程序退出时,代码为0xc000007b。”
  • stdout或stderr上没有任何输出。
  • 如果我把有趣的东西放在main例如int * p(nullptr); *p = 5; int * p(nullptr); *p = 5; ,程序不会崩溃(即使没有这个,我也肯定main()没有运行)。

是什么导致此问题? 我该如何调试? 由于我的代码都不曾运行,因此我不确定在调试器中的哪里设置断点...

0xc000007bSTATUS_INVALID_IMAGE_FORMAT 也就是说,操作系统甚至从未加载过足够的二进制文件以开始执行它。

您的编译设置可能有问题。 但是,通常当我看到此错误时,问题出在试图动态链接到32位DLL的64位应用程序中。

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

errlook效用说127是“指定的程序无法找到。”搜索文本在<winerror.h>产生ERROR_PROC_NOT_FOUND

这听起来像是DLL问题。

现在,我不喜欢将术语“入口点”应用到main ,因为然后应该调用入口点,即您提供给链接器以设置入口点的地址吗? 启动功能可能更好。 这不仅是令人困惑:微软的技术作家已经彻底混淆了自己,以至于现在可以庆祝20年来有关PE入口点的不正确且仅有自相矛盾的文档。 我认为他们永远做不到。

根据我的经验, gdb非常不可靠,不是检查是否调用了某些东西的好工具。 这是不可靠的,至少在将我检测为用户时才如此。 而是在main一个消息框或其他易于识别和保证的内容。

您可以通过/ ENTRY编译器标志找到(并修改)exe的入口点。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM