我很难理解符号表的工作原理:我的教科书描述了编译器的工作原理,但从不制作任何符号表示例。范围和联系的概念也很混乱。
例如,一项给我带来麻烦的任务;给出这个C代码:
extern int x;
const int z = 3;
static short int w;
void g( void ){
static int t;
...
}
假设内存按以下部分组织:TEXT,RODATA(只读),DATA,BSS,SHARED,... STACK,HEAP。
使用以下字段编译符号表: 符号,大小,范围(本地或全局),链接(外部或内部),地址(在创建或未创建时定义),段(内存)。
我理解符号可以是函数也可以是变量;但是当我在目标文件上使用nm命令时,我得到了这个输出:
00000000 T main
00000000 b w
00000000 R z
g函数和int t根本就不存在!
输出应该表示以下内容:main()在TEXT部分中,w未初始化,z是只读的。所以,如果我理解正确,这应该意味着主要转到TEXT,z转到RODATA,转到BSS(分段字段)。
我的问题是:为什么g和t缺失?我如何填写其他字段(或者只是对SCOPE和LINKAGE之间区别的简短实用描述是受欢迎的)?
感谢您的时间。
答案 0 :(得分:1)
仅为全局声明的变量创建符号。不适用于函数内声明的函数和变量。
有两种类型的符号。 1.强烈的符号 2.弱符号
如果全局声明的变量是Initialized,则它属于Strong符号类别。 例如
const int z = 3;
如果全局声明的变量未初始化,则它属于弱符号类别。 例如
static short int w;