全局变量在elf文件中的位置在哪里?

13

我想了解有关 ELF 文件的知识,但是当我想到全局变量、静态全局变量和静态作用域变量时,有些困惑。例如:

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();
}

谁能告诉我每个变量属于哪个段?在我看来,bdf 属于 .bss 段,而 ace 属于数据段,但我不知道 ELF 文件中全局静态变量和全局变量之间的区别。

2个回答

19
你可以使用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.bss,而 ace.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 工具,它更好地显示了 elf 特定的内容。 objdump 和底层的 BFD 库可能无法很好地显示某些文件格式特定的数据。

11

一般来说,可执行文件的数据段包含已初始化的全局/静态变量,而BSS段包含未初始化的全局/静态变量。

当加载程序到内存时,未初始化的全局/静态变量会自动填充为零。

在C语言中,函数内部声明的静态变量(无论是否被初始化)仅表示这些变量具有本地/函数作用域(有时称为内部静态变量),但根据其是否被初始化,它们仍然驻留在数据/BSS段中。

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

在任何函数之外定义的静态变量仍然驻留在数据或bss段中,但仅具有文件作用域。

当代码编译时,每个目标文件都有一个导入和导出列表,由链接编辑器使用。您的静态变量将不会在导出列表中,并且因此对其他目标文件不可访问。

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

图示如下:

+--------- 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) |
+------------------------+

我无法理解什么是导出列表。它是符号表吗? - CrystalJake
简而言之,每个.o(目标文件)的一部分是导出列表(外部符号列表 - 全局变量/函数),这些符号对其他目标文件可见。此外,还有一个导入列表(全局变量/函数),这些符号在目标文件内被引用但在其他地方定义。在编译的链接阶段,链接编辑器使用这些列表将符号连接在一起。 - ffhaddad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接