操做系统:ubuntu 13.04
工具:gcc, objdump, readelf
参考:《程序员自我修养》
代码编译后的机器指令常常被放在代码段里,代码段名为".text";已初始化的全局变量和已初始化的局部静态变量常常放在数据段里,数据段名为".data";未初始化的全局变量和未初始化局部静态变量通常放在“.bss”段里,.bss在文件中不占据空间。字符串常量通常放在“.rodata”段里。
经过代码编译后查看文件内部结构来论证一下上面观点,代码以下:
代码:程序员
点击(此处)折叠或打开ubuntu
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:c#
点击(此处)折叠或打开sass
gcc -c 1.c
使用objdump来查看目标文件的结构和内容,命令以下:
工具
点击(此处)折叠或打开ui
objdump -s -d 1.o
目标文件结构和内容以下(只保留.bss段、.text段、.data段、.rodata段):操作系统
点击(此处)折叠或打开.net
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 0000a1