想知道COFF Externs
Microsoft PE / COFF SPEC(v8,第5.4.4节)说,当符号具有:
存储类IMAGE_SYM_CLASS_EXTERNAL
节号为0(IMAGE_SYM_UNDEFINED)
它是“值”字段(在符号表中),“表示大小”。
这让我很困惑。特别是,我想知道“表明什么的大小?”。
通常,CL(visual C ++)使用
IMAGE_SYM_CLASS_EXTERNAL
和IMAGE_SYM_UNDEFINED
来表示外部。
为什么链接器需要知道或关心符号的大小?它不仅需要知道一个名称,它是一个extern,并且设置了适当的重定位项吗?这些都不取决于尺寸。现在,诚然,编译器需要知道这一点,但它会从头文件而不是从目标文件中获取该信息。
我已经看了一些由CL编译的简单示例externs,而Value字段似乎总是为零。因此,它显然没有用于编码字段的大小。
有谁知道规格所指的“尺寸”是什么?他们的视觉工作室链接器可能使用该字段的任何场景,还是规范中的模糊只是废话?我有限的大脑无法想到任何这样的场景。
更新:
请注意,它不会,至少不总是,似乎是符号的大小。在我观察到的情况下,VALUE总是0,因此问题。
没有找到相关结果
已邀请:
4 个回复
裸雷胜檀哭
b.cpp:
然而,链接器没有发现这种不匹配的事实表明不使用Value。我没有简单的方法来看。
乐遣杀屎
我的调查时间很长,结果如此: C ++编译器将未经过身份处理的数据放入.bss部分,并使用IMAGE_SCN_CNT_UNINITIALIZED_DATA标记它,但是 纯C编译器的行为方式不同(libcmt是用C语言编写的)。 链接器有责任将未初始化的数据放入段中。 如果C编译器发出没有section(0)的符号并标记为external和if 它的value字段为零,然后在其他地方声明它,但如果value字段不为null,那么 意味着给定的OBJ文件确实包含该符号但它未初始化。 所以链接器应该保留在.bss部分中。 '价值'大小的地方。 当你将这些行更改为:
将存在零值字段,它们都将放在.data部分中。 祝你好运,抱歉我的英语不好。
凄嘛姥
埠仙俊