LINUX下目标文件的BSS段、数据段、代码段

    xiaoxiao2022-07-02  106

    转自 http://blog.chinaunix.net/uid-27018250-id-3867588.html  LINUX下目标文件的BSS段、数据段、代码段

    操作系统:ubuntu 13.04 工具:gcc, objdump, readelf 参考:《程序员自我修养》 代码编译后的机器指令经常被放在代码段里,代码段名为".text";已初始化的全局变量和已初始化的局部静态变量经常放在数据段里,数据段名为".data";未初始化的全局变量和未初始化局部静态变量一般放在“.bss”段里,.bss在文件中不占据空间。字符串常量一般放在“.rodata”段里。 通过代码编译后查看文件内部结构来论证一下上面观点,代码如下: 代码:

    点击(此处)折叠或打开

    int printf(const char* format, ...); int global_init_var = 84; //已初始化的全局变量int global_uninit_var;    //未初始化的全局变量char *str1 = "hello world!"; //字符串常量 void func1(int i){  printf("%d\n", i);} int main(void){  static int static_var = 85; //已初始化的静态局部变量  static int static_var2;     //未初始化的静态局部变量   char *str2 = "22222";       //字符串常量   int a = 1;  int b;   func1(static_var+static_var2+a+b);   return a;}

    上面代码保存为1.c,编译生成目标文件1.o:

    点击(此处)折叠或打开

    gcc -c 1.c

    使用objdump来查看目标文件的结构和内容,命令如下:  

    点击(此处)折叠或打开

    objdump -s -d 1.o

    目标文件结构和内容如下(只保留.bss段、.text段、.data段、.rodata段):

    点击(此处)折叠或打开

    1.o: file format elf32-i386 Contents of section .text: 0000 5589e583 ec188b45 08894424 04c70424 U......E..D$...$ 0010 0d000000 e8fcffff ffc9c355 89e583e4 ...........U.... 0020 f083ec20 c7442414 11000000 c7442418 ... .D$......D$. 0030 01000000 8b150800 0000a100 00000001 ................ 0040 c28b4424 1801c28b 44241c01 d0890424 ..D$....D$.....$ 0050 e8fcffff ff8b4424 18c9c3            ......D$... Contents of section .data: 0000 54000000 00000000 55000000          T.......U... Contents of section .rodata: 0000 68656c6c 6f20776f 726c6421 0025640a hello world!.%d. 0010 00323232 323200                     .22222.      Disassembly of section .text: 00000000 <func1>:   0:    55                     push 
    转载请注明原文地址: https://yun.8miu.com/read-19654.html
    最新回复(0)