Linux obj 定义描述

来源:互联网 发布:电脑解压软件下载 编辑:程序博客网 时间:2024/06/14 21:42


Ndx定义了和该符号相关的section index


bind域说明了该符号的可见性和行为:

GLOBAL表示可以对所有的.o文件可见,

LOCAL表示对其他的.o文件不可见(对c程序员而言就是static修饰符,由于是local的,因此用static修饰的变量可以重名)。

WEAK,表示该符号是一个weak symbol。weak symbol的含义和global symbol含义是一样的,都是对外可见,只不过在如果有其他定义的同名的global symbol,那么weak symbol就消失。


LOCAL符号不是临时变量(hello_world函数中的tmp),临时变量是放在stack中的,不会出现在符号表中。

外部符号,目前我们对其一无所知,因此其size等于0,type是NOTYPE,对应的section是UND,表示该符号undefine(在section table中,第一个entry就是undefine section)。


COM是一个特别定义的section index,标识这是一个common block。


要理解这一点需要一些背景知识:传统的unix编译器是允许在多个编译单元(c文件)中定义未初始化的全局变量的,也就是说,在两个c文件中都定义了名字一样的未初始化的全局变量是不会引起编译错误的,
编译器在编译的时候会把未初始化的全局变量放入到common block中而不是.bss section。假如放入到.bss section,就意味着已经分配了该符号的地址,runtime的时候会占用内存。
那么linker在合并.bss section的时候就会发现重复定义的符号了。gcc的编译器的缺省行为和传统unix c编译器一致,
因此将hello_world_bss放入到common block中。其实这一点可能会给程序员(主要是粗心的程序员)带来非常难以解决的bug,你可以使用-fno-common来关闭这个特性,这时候,定义在多个文件中的同名的未初始化的全局变量在link的时候会报错。


原创粉丝点击