想知道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,因此问题。     
已邀请:
如何声明大小的数组的extern声明: a.cpp:
 extern int example[42];
b.cpp:
 int example[13];
然而,链接器没有发现这种不匹配的事实表明不使用Value。我没有简单的方法来看。     
威斯涅夫斯基先生,我相信我找到了答案。 我是学生,我试图编写自己的链接器。 它的第一个版本可以链接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编译器发出没有section(0)的符号并标记为external和if 它的value字段为零,然后在其他地方声明它,但如果value字段不为null,那么 意味着给定的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部分中。 祝你好运,抱歉我的英语不好。     
它是符号引用的数据结构的大小。 基本上,如果符号未定义,则链接器无法以其他方式查找数据结构的大小,因此需要事先知道实例化时的大小,以便在链接期间处理这些问题。     
你有一个非常奇特但有趣的问题。它是正确的,在COFF内部生成符号表的唯一可能性是/ Zd编译器开关的使用,直到Visual C ++ 6.0并使用旧的链接器开关/ debugtype:coff(参见http://www.debuginfo.com/)文章/ gendebuginfo.html#gendebuginfovc6)?是否有可能在COFF内部至少使用Visual Studio 2008生成符号表? 我的想法是尝试生成一个PE,其存储类IMAGE_SYM_CLASS_EXTERNAL的符号表和关于链接器开关/ FORCE(/ FORCE:UNRESOLVED或/ FORCE:MULTIPLE)的节号0(IMAGE_SYM_UNDEFINED)和/ INCLUDE的未解析符号:dummySymbol或/ NODEFAULTLIB。我的问题是在COFF内部生成符号表并不容易。你收到测试PE的地方?     

要回复问题请先登录注册