【发布时间】:2020-05-23 13:18:32
【问题描述】:
我正在尝试将 MinGW gcc 生成的目标文件与 MinGW 提供的 ld.exe 链接,以在 Windows 10 64 位上创建最终的 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 启动代码,发现它使用 kernel32.dll 导出的GetCommandLine() API 在解析它们并将它们提供给 main 之前获取命令行参数,因此在与 ld 链接期间,我提供了 32我的 PC 上的 kernel32.dll 的位版本也在输入中
ld --verbose -o output.exe maincaller.o maindefined.o "c:\windows\syswow64\kernel32.dll"
这不会像预期的那样引发未解决的外部错误,但最终生成的 output.exe 是一个绝对没有输入的零 kb 文件。 Ld verbose 也不会发出任何有用的错误输出。可能出了什么问题?希望对此有所帮助
【问题讨论】:
-
如果你直接使用
-lkernel32而不是kernel32.dll,会发生同样的情况吗? -
我没有检查这个。事实证明这是一个防病毒问题。我 PC 中的赛门铁克在 ld.exe 成功创建二进制文件后删除了该二进制文件的全部内容。对于这样一个愚蠢的问题,度过了非常令人沮丧的一天。
标签: mingw linker-errors mingw-w64