在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數據段以及其他段的字節對齊方式可以不一樣呢?