c 语言变量的存储布局 笔记

来源:互联网 发布:知乎怎么修改关注话题 编辑:程序博客网 时间:2024/05/22 22:56

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,初值为0int 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 反汇编代码 


0 0
原创粉丝点击