elf文件中的全局variables在哪里?

最近我想学习关于elf文件的一些知识,但是当我遇到全局variables,全局静态variables和范围静态variables时,我有点混乱,比如:

int a = 2; int b; static int c = 4; static int d; void fun(){ static int e = 6; static int f; } int main(void){ fun(); } 

谁知道每个variables属于哪个段?在我看来,b,d,f属于bss段,a,c,e属于数据段,但是我不知道全局variables和全局variables的区别精灵文件。

您可以使用objdump -t查看符号表:

 $ objdump -t foo | grep -P ' \b(a|b|c|d|e|f)\b' 0000000000601034 l O .data 0000000000000004 c 0000000000601040 l O .bss 0000000000000004 d 0000000000601044 l O .bss 0000000000000004 f.1710 0000000000601038 l O .data 0000000000000004 e.1709 0000000000601048 g O .bss 0000000000000004 b 0000000000601030 g O .data 0000000000000004 a 

你是对的, bdf.bssace.data 。 符号是否是静态的被记录在符号表的一个单独的标志中 – 这是第二列中的lg标志。

elf(5)手册页说这些记录是使用符号表的st_info成员的STB_LOCALSTB_GLOBAL值记录的。 /usr/include/elf.h表示STB_GLOBAL是1,而STB_LOCAL是0.有一个宏ST_BIND来检索st_info字段的绑定位。


objdump还有很多其他标志 – 请参阅手册页 。 objdump适用于所有架构,但也有一个elfdump工具,可以更好地显示精灵特定的东西。 objdump和底层的BFD库可以做一些糟糕的工作来显示一些文件格式特定的数据。

通常,可执行文件的数据段包含初始化的全局/静态变量,而BSS段包含未初始化的全局/静态变量。

当加载器将程序加载到内存中时,单位化的全局/静态变量将自动填零。

在C中,函数内的静态变量(初始化或非初始化)仅仅意味着变量具有局部/函数范围(有时称为内部静态),但是它们仍然存在于数据/ BSS段中,取决于它们是否被初始化。

所以无论fun()被调用了多少次,静态变量在程序加载时只会被初始化一次。

定义为静态和在任何函数之外的变量仍然存在于数据或bss段中,但仅具有文件范围。

编译代码时,会有一个导入和导出列表,它是每个对象文件的一部分,由链接编辑器使用。 您的静态变量将不在导出列表中,因此不能被其他目标文件访问。

通过排除静态关键字,您的全局变量将被放置在导出列表中,并且可以被其他对象模块引用,并且链接编辑器将在创建可执行文件时能够找到这些符号。

对于pictoral视图:

 +--------- TEXT ---------+ Low memory | main() | | fun() | +--------- DATA ---------+ | int a (global scope) | | int c (file scope) | | int e (function scope) | +---------- BSS ---------+ | int b (global scope) | | int d (file scope) | | int f (function scope) | +------------------------+