mingw - MinGW Ld 在链接目标文件后创建大小为零的最终可执行文件
问题描述
我正在尝试将 MinGW gcc 生成的目标文件与 MinGW 提供的 ld.exe 链接,以在 Windows 10 64 bit 上创建最终的 32 位可执行文件。代码非常简单。我有一个带有 main 函数的 maindefined.c 文件:
void main(int argc, char **argv) {}
对于 mainCRTStartup,我正在使用我在 GitHub 上找到的自定义 C 启动代码 nocrt0,该代码声称与 MinGW 完全兼容: https ://github.com/matveyt/nocrt0 ,它解析命令行参数并通过提供这些参数调用 main()论据。
我已将此启动代码 nocrt0c.c(因为我正在尝试开发一个简单的控制台应用程序)放在名为 maincaller.c 的文件中
我正在通过 MinGW gcc 命令行为这两个 C 源创建目标文件
gcc -g -O -c maincaller.c -m32
gcc -g -O -c maindefined.c -m32
我查看了 nocrt0 启动代码,发现它使用GetCommandLine()
kernel32.dll 导出的 API 在解析它们并将它们提供给 main 之前获取命令行参数,因此在与 ld 链接期间,我提供了 kernel32.dll 的 32 位版本在我的电脑上输入
ld --verbose -o output.exe maincaller.o maindefined.o "c:\windows\syswow64\kernel32.dll"
正如预期的那样,这不会引发未解决的外部错误,但生成的最终 output.exe 是一个绝对没有输入的零 kb 文件。Ld verbose 也不会发出任何有用的错误输出。可能出了什么问题?希望对此有所帮助
解决方案
事实证明这是一个愚蠢的问题,但我想把它留在这里,不管以后有人入住。我 PC 上的 Symantec Antivirus 在 ld.exe 成功创建后删除了整个二进制文件的内容。因此,如果您正在做任何 MinGW 或与任何其他工具链相关的链接,一个好主意是禁用您拥有的任何防病毒/访问保护解决方案。
推荐阅读
- python - BeautifulSoup:在标签内获取文本
- java - Java 设置 GUI 对象的 null
- kotlin - kotlin jpa 中的类投影
- javascript - React setState() 不更新状态
- django - Django REST Frameworking:修改 GET 请求的 PrimaryKeyRelatedField 查询集
- javascript - 使用渲染功能渲染 html
- java - 带有抽象类和 XML 的 @RequestBody
- html - 为什么用巨大的空间包装 flexbox 列对齐的项目?
- c++ - 创建对隐式强制转换产生的子类实例的父类引用
- android - 如何制作可滑动的对话框