使用MinGW-w64编译GCC 13.2.0时遇到“export ordinal too large: 77583”错误
用MinGW-w64编译GCC 13.2.0时遇到“export ordinal too large: 77583”错误
嘿,这个问题我之前帮朋友排查过,本质是Windows PE文件格式的限制——它要求导出表的序数不能超过65535,而GCC 13.2.0编译生成的cc1.exe导出的符号数量太多,直接突破了这个上限。给你几个亲测有效的解决思路:
修改链接器参数,限制导出符号数量
这是最直接的解决办法。默认情况下,MinGW-w64的链接器会导出所有符号,我们可以通过参数让它只导出必要的符号,大幅减少序数数量。在配置GCC的时候,给configure命令加上对应的编译和链接参数:../configure --target=x86_64-w64-mingw32 --prefix=/path/to/your/install \ CXXFLAGS="-Wl,--no-export-all-symbols" \ LDFLAGS="-Wl,--no-export-all-symbols"这里的
--no-export-all-symbols会告诉链接器只保留显式标记为导出的符号,避开默认导出所有符号的行为。升级你的MinGW-w64工具链
如果你当前使用的MinGW-w64版本比较旧,可能对PE格式的导出表优化不够完善。建议升级到最新版的MinGW-w64(比如10.0及以上版本),新版本的链接器针对这类大符号量的场景做了优化,可能能自动处理部分冗余符号的导出问题。启用链接时间优化(LTO)
开启LTO不仅能提升编译后程序的性能,还能在链接阶段进一步清理不必要的符号,减少导出数量。在配置时加上--enable-lto参数,结合上面的链接器参数一起使用:../configure --target=x86_64-w64-mingw32 --prefix=/path/to/your/install \ --enable-lto \ CXXFLAGS="-Wl,--no-export-all-symbols" \ LDFLAGS="-Wl,--no-export-all-symbols"
另外要注意,如果你是在编译32位的GCC,这个问题会更容易出现,因为32位程序的符号冗余可能更多,上面的方案同样适用。
备注:内容来源于stack exchange,提问作者sean
相关产品推荐
相关产品推荐

