首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >想知道COFF的远门

想知道COFF的远门
EN

Stack Overflow用户
提问于 2010-05-12 22:37:38
回答 4查看 880关注 0票数 1

Microsoft /COFF规范(v8,5.4.4节)指出,当符号具有:

IMAGE_SYM_CLASS_EXTERNAL

  • And的存储类(IMAGE_SYM_UNDEFINED)

节数为0的

它是"value“字段(在符号表中),”指示大小“。

这让我很困惑。特别是,我想知道“表示什么的大小?”。

一般情况下,IMAGE_SYM_CLASS_EXTERNALIMAGE_SYM_UNDEFINED被CL(visual C++)用来表示外部元素。

为什么链接器需要知道或关心符号的大小?它不只是需要知道一个名称,它是一个外挂,并有适当的重新定位条目设置?所有这些都不应取决于规模。诚然,编译器需要知道这一点,但它将从头文件而不是从对象文件中获取这些信息。

我看过CL编译的一些简单的外部示例,而Value字段似乎总是为零。因此,它显然没有被用来编码字段的大小。

有人知道规范指的是什么“大小”吗?他们的场景中,visual链接器可能会使用该字段,还是规范中的blurb只是一派胡言?我有限的大脑无法想象任何这样的情景。

更新:

请注意,它并不是,至少不是总是看起来是符号的大小。在我观察到的情况下,值始终是0,这就是问题所在。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-05-19 10:08:49

对于声明大小的数组,外挂声明如何:

a.cpp:

代码语言:javascript
复制
 extern int example[42];

b.cpp:

代码语言:javascript
复制
 int example[13];

然而,链接器没有捕捉到这种不匹配的事实表明,该值没有被使用。我没什么容易看到的。

票数 1
EN

Stack Overflow用户

发布于 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中有一个声明:

代码语言:javascript
复制
#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部分的位置。“价值”大小的地方。当您将这些行更改为:

代码语言:javascript
复制
#ifdef WPRFLAG
wchar_t *_wcmdln = 0xCCCCCCCC; /* points to wide command line */
#else  /* WPRFLAG */
char *_acmdln = 0xCCCCCCCC; /* points to command line */
#endif  /* WPRFLAG */

将有零值字段,这两个字段都将放置在.data部分。

祝你好运,为我糟糕的英语道歉。

票数 4
EN

Stack Overflow用户

发布于 2010-05-17 15:16:03

它是符号所引用的数据结构的大小。

基本上,如果符号没有定义,链接器就无法找到数据结构的大小,因此需要预先知道它在实例化时有多大,以便在链接期间处理这些问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2823256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档