全局变量位于elf文件中的哪个位置

我想了解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库在显示一些特定于文件格式的数据方面做得不好.

上一篇:PDF转Image最终方案


下一篇:Api 存储过程分页