符号表的C程序

时间:2014-07-18 11:26:37

标签: c memory symbols

我很难理解符号表的工作原理:我的教科书描述了编译器的工作原理,但从不制作任何符号表示例。范围和联系的概念也很混乱。

例如,一项给我带来麻烦的任务;给出这个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之间区别的简短实用描述是受欢迎的)?

感谢您的时间。

1 个答案:

答案 0 :(得分:1)

仅为全局声明的变量创建符号。不适用于函数内声明的函数和变量。

有两种类型的符号。 1.强烈的符号 2.弱符号

如果全局声明的变量是Initialized,则它属于Strong符号类别。 例如

const int z = 3;

如果全局声明的变量未初始化,则它属于弱符号类别。 例如

static short int w;