Linux下利用objdump查看文件空间地址分布

Posted jrglinux

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux下利用objdump查看文件空间地址分布相关的知识,希望对你有一定的参考价值。

在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数据段以及其他段的字节对齐方式可以不一样呢?

 

以上是关于Linux下利用objdump查看文件空间地址分布的主要内容,如果未能解决你的问题,请参考以下文章

异常强大的linux下查看符号信息的命令:ldd,nm,readelf,ar,objdump

Linux下objdump查看C程序编译后的汇编代码

arm-linux-objdump 的使用

使用objdump objcopy查看与修改符号表

brk() 和 mmap() 内存映射

arm-linux-objdump