Microsoft /COFF规范(v8,5.4.4节)指出,当符号具有:
IMAGE_SYM_CLASS_EXTERNAL
节数为0的
它是"value“字段(在符号表中),”指示大小“。
这让我很困惑。特别是,我想知道“表示什么的大小?”。
一般情况下,IMAGE_SYM_CLASS_EXTERNAL和IMAGE_SYM_UNDEFINED被CL(visual C++)用来表示外部元素。
为什么链接器需要知道或关心符号的大小?它不只是需要知道一个名称,它是一个外挂,并有适当的重新定位条目设置?所有这些都不应取决于规模。诚然,编译器需要知道这一点,但它将从头文件而不是从对象文件中获取这些信息。
我看过CL编译的一些简单的外部示例,而Value字段似乎总是为零。因此,它显然没有被用来编码字段的大小。
有人知道规范指的是什么“大小”吗?他们的场景中,visual链接器可能会使用该字段,还是规范中的blurb只是一派胡言?我有限的大脑无法想象任何这样的情景。
更新:
请注意,它并不是,至少不是总是看起来是符号的大小。在我观察到的情况下,值始终是0,这就是问题所在。
发布于 2010-05-19 10:08:49
对于声明大小的数组,外挂声明如何:
a.cpp:
extern int example[42];b.cpp:
int example[13];然而,链接器没有捕捉到这种不匹配的事实表明,该值没有被使用。我没什么容易看到的。
发布于 2010-12-13 20:42:48
Mr.Wisniewski,我相信我找到了答案。我是个学生,我试着写我自己的链接器。它的第一个版本可以链接OBJ文件并将它们转储到我自己的二进制格式中。但很快我就意识到许多C++语言特性没有LIBCMT.LIB是不受支持的。所以一开始我编写了lib解析器..。并且在试图连接CRT时被困住了。在文件LIBCMT.LIB的第二个链接器成员中,指定了对象文件crt0.obj (libcmt内)包含符号__acmdln (指向命令行的全局指针).但我没能在那里找到它!我真的很沮丧..。符号有IMAGE_SYM_CLASS_EXTERNAL和IMAGE_SYM_UNDEFINED节,但为什么?在源文件crt0.c中有一个声明:
#ifdef WPRFLAG
wchar_t *_wcmdln; /* points to wide command line */
#else /* WPRFLAG */
char *_acmdln; /* points to command line */
#endif /* WPRFLAG */我的调查相当长,结果是:
C++编译器将未初始化的数据放入.bss部分并使用IMAGE_SCN_CNT_UNINITIALIZED_DATA标记,但是纯C编译器的行为方式不同(libcmt是用C编写的)。
将未初始化的数据放入区段是链接器的职责。如果C编译器在没有节(0)的情况下发射符号并标记为external,并且如果它的值字段是零,那么它将被声明到其他任何地方,但是如果值字段不是空,这意味着给定的OBJ文件确实包含该符号,但它没有初始化。所以链接器应该为它保留.bss部分的位置。“价值”大小的地方。当您将这些行更改为:
#ifdef WPRFLAG
wchar_t *_wcmdln = 0xCCCCCCCC; /* points to wide command line */
#else /* WPRFLAG */
char *_acmdln = 0xCCCCCCCC; /* points to command line */
#endif /* WPRFLAG */将有零值字段,这两个字段都将放置在.data部分。
祝你好运,为我糟糕的英语道歉。
发布于 2010-05-17 15:16:03
它是符号所引用的数据结构的大小。
基本上,如果符号没有定义,链接器就无法找到数据结构的大小,因此需要预先知道它在实例化时有多大,以便在链接期间处理这些问题。
https://stackoverflow.com/questions/2823256
复制相似问题