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

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 反汇编代码 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值