首页 > 解决方案 > 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 也不会发出任何有用的错误输出。可能出了什么问题?希望对此有所帮助

标签: mingwlinker-errorsmingw-w64

解决方案


事实证明这是一个愚蠢的问题,但我想把它留在这里,不管以后有人入住。我 PC 上的 Symantec Antivirus 在 ld.exe 成功创建后删除了整个二进制文件的内容。因此,如果您正在做任何 MinGW 或与任何其他工具链相关的链接,一个好主意是禁用您拥有的任何防病毒/访问保护解决方案。


推荐阅读