我想了解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();
}
谁能告诉每个变量属于哪个细分?在我看来,
b,d和f属于.bss段,a,c和e属于数据段,但我不知道elf文件中全局静态变量和全局变量之间的区别.
解决方法:
您可以使用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
你是对的,b,d和f是.bss而a,c和e是.data.符号是否为静态记录在符号表的单独标志中 – 即第二列中的l或g标志.
elf(5) man page表示使用符号表的st_info成员的STB_LOCAL和STB_GLOBAL值记录这些值. /usr/include/elf.h表示STB_GLOBAL为1,而STB_LOCAL为0.有一个宏ST_BIND用于检索st_info字段的绑定位.
objdump有很多其他标志 – 请参阅man page.objdump适用于所有架构,但也有一个elfdump工具可以更好地显示精灵特定的东西. objdump和底层的BFD库在显示一些特定于文件格式的数据方面做得不好.