1、源代码 main.c
#include <stdio.h>
const int A = 10; // GLOBAL的符号
//const表示只读,不可修改, 分配在.rodata
//程序加载运行时,.rodata 段和 .text 段通常合并到一个Segment中
int a = 20; // GLOBAL符号
// 分配在.data 字段
static int b = 30; // LOCAL符号
// 分配在 .data 字段
//只能在一个目标文件中定义和使用
int c; // GLOBAL 符号
// 分配在.bss段,紧挨着.data 段,
// .data 和 .bss 在加载时合并到一个Segment中,这个Segment 可读可写
// 不同之处.bss 在文件中不占存储空间,在加载时填充为0,初值为0
int main(void)
{
static int a = 40; // LOCAL 符号
// 不像其他局部变量在调用函数时分配,在函数返回时释放,而是像全局变量一样静态分配,作用域只在函数中起作用
// 分配在 .data 字段
char b[] = "Hello world"; // 保存在栈上
// 虽然栈是从高地址向低地址增长的,但是数组总是从低地址向高地址排列的
register int c = 50; // register关键字指示编译器尽可能分配一个寄存器来存储这个变量
printf("Hello world %d\n", c); // 分配在.rodata
// 字符串字面值是只读的,相当于在全局作用域定义了一个const数组
return 0;
}
2、分析使用到的命令
(1)使用 gcc main.c -g 生成可执行文件
(2)使用 readelf -a a.out 命令查看符号表
(3)使用 hexdump -C a.out 命令查看段内容
(4)使用 objdump -dS a.out 反汇编代码