【问题标题】:MinGW Ld creating final executable of zero size after linking object filesMinGW Ld 在链接目标文件后创建大小为零的最终可执行文件
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多