在linux中新建test.c文件,源代码如下:
1 #include<stdio.h> 2 int a=1; 3 int main() 4 { 5 printf("a is %d.",a); 6 return 0; 7 }
然后分别生成test.o和test文件
$ gcc -c test.c $ gcc -o test test.c
利用objdump命令分别查看test.o和test
首先看test.o
file format elf64-x86-64:文件所在平台属性,这里是64位x86处理器平台
Sections:
Size: 段的大小,字节为单位
VMA: 段在虚拟地址中的位置
LMA:段在加载地址中的位置
File off: File offset,段的起始位置
Algn:字节对齐方式,2**2表示2的平方即为4,2**3表示2的3次方即为8
这里面重要的有
.text(代码段)
.data(数据段)
.bss
查看test文件的空间位置:
段的数量明显多于未链接文件test.o
我们将test.c代码复制到test1.c文件,并稍加修改
可以看到,.text代码段和.data数据段大小都增加了,
.text代码段增大了9字节(22变为31)
.data数据段增加了一个int型4字节变量大小(源代码中int b=2,多了一个变量b)
注意.data的File off起始位置为00000074,而不是00000071,这是字节对齐而导致的
有个待解答问题:
为什么.text代码段和.data数据段以及其他段的字节对齐方式可以不一样呢?
时间: 2024-10-12 15:55:26