【发布时间】:2014-03-18 17:26:15
【问题描述】:
我正在编写一个在 Windows 上运行的链接器,它接受了 PE 格式目标文件的大多数功能,但是我遇到了 libcmt 中 _aenvptr 和 _wenvptr 的重复定义的问题。
根据我在 PE 文档、使用 Microsoft 编译器和 dumpbin 的试验和错误以及这里偶尔出现的问题之间能够弄清楚的情况,规则是:
int x;
作为一个全局变量转换为没有节的 IMAGE_SYM_CLASS_EXTERNAL。如果这种情况出现在多个目标文件中,这很好,并且会采用最大的一个并将其用作 BSS 定义。
int x = 0;
作为全局变量转换为带有 BSS 部分的 IMAGE_SYM_CLASS_EXTERNAL。如果这发生在多个目标文件中,则这是一个重复符号错误。
问题在于 libcmt 以后一种形式提供了 _aenvptr 和 _wenvptr 的多个定义。 Microsoft 链接器对此很满意,但据我所知,它对我创建的小型测试库中的等效案例并不满意。
_aenvptr 和 _wenvptr 不是 COMDAT,它们也没有任何辅助符号记录或我能找到的任何其他奇怪的东西。
我错过了什么?
【问题讨论】:
标签: c windows visual-c++ linker portable-executable