您的位置 首页 技术

汇编技能内情(6)

问题:全局变量和全局常量在进程地址空间的位置?显然,根据前面的叙述,全局变量在用户的数据段,那么全局常量呢,是数据段吗?同样的

问题:大局变量大局常量在进程地址空间的方位?

明显,依据前面的叙说,大局变量在用户的数据段,那么大局常量呢,是数据段吗?
相同的,能够运用mdb将test5进程挂起,然后用pmap指令求证一下:
# mdb test5
Loading modules: [ libc.so.1 ]
> ::sysbp _exit ; 在体系调用_exit处设置断点
> :r ; 运转程序
mdb: stop on entry to _exit
mdb: target stopped at:
libc.so.1`exit+0x2b: jae +0x15 >

此刻,程序运转后在_exit处挂起,能够运用pmap在另一个终端内检查test5进程的地址空间了:
# ps -ef | grep test5
root 1387 1386 0 02:23:53 pts/1 0:00 test5
root 1399 1390 0 02:25:03 pts/3 0:00 grep test5
root 1386 1338 0 02:23:41 pts/1 0:00 mdb test5
# pmap -F 1387 ; 用pmap强制检查
1387: test5
08044000 16K rwx– [ stack ] ; test5的stack
08050000 4K r-x– /export/home/asm/L3/test5 ; test5的代码段,开始地址为0x08050000
08060000 4K rwx– /export/home/asm/L3/test5 ; test5的数据段,开始地址为0x08060000
DDAC0000 628K r-x– /usr/lib/libc.so.1
DDB6D000 24K rwx– /usr/lib/libc.so.1
DDB73000 4K rwx– /usr/lib/libc.so.1
DDB80000 4K r-x– /usr/lib/libdl.so.1
DDB90000 292K r-x– /usr/lib/ld.so.1
DDBE9000 16K rwx– /usr/lib/ld.so.1
DDBED000 8K rwx– /usr/lib/ld.so.1
total 1000K
能够看到,因为test5程序没有运用malloc来请求内存,所以没有heap的映射
前面用mdb调查过这些大局变量和常量的初始化值,它们的地址分别是:
大局变量i,j,k:
0x8060904开始的12字节
大局变量l,m,n:
0x8060948开始的12字节
大局常量o,p,q:
0x8050808开始的12字节
明显,依据这些变量的地址,咱们能够初步判断出这些变量归于哪个段:
因为test5数据段开始地址为0x08060000,咱们得出定论:大局变量i,j,k,l,m,n归于数据段
而test5代码段的开始地址为0x08050000,咱们得出定论:大局常量o,p,q归于代码段
得出这个定论确实有点让人意外:大局常量居然在代码段。
却又好像在情理之中:数据段内存映射后的特点是r/w/x,而常量要求是只读特点,所以在代码段(r-x)就入情入理了。

问题:为什么这些大局变量地址不是接连的?

很简单注意到,大局变量i,j,k和l,m,n以及大局常量o,p,q是接连声明的,但地址实践上并不接连,而是在3段接连12字节的地址上。
当然,大局常量归于代码段,所以地址和大局变量是分隔的;那么,为什么大局变量也并非接连呢?

概念:ELF(Executable and Linking Format) 可执行衔接格局

ELF格局是UNIX体系实验室(USL)作为使用程序二进制接口(Application Binary Interface,ABI)而开发和发布的。
现在,ELF格局是Unix/Linux平台上使用最广泛的二进制工业规范之一

下图从不同视角给出了ELF文件的一般格局:

Linking 视角 Execution 视角
============ ==============
ELF header ELF header
Program header table (optional) Program header table
Section 1 Segment 1
Segment 2
Section n
Section header table Section header table (optional)

图 3-2 ELF文件格局 摘自 EXECUTABLE AND LINKABLE FORMAT (ELF)

能够依据test5 ELF文件的Program header table和Section header table中文件偏移量的信息描绘出test5的内容:

entry name 开始文件偏移+实践巨细=下个entry开始偏移
——————————————————-
ELF header 0x0+0x34=0x34
Program header 0x34+0xa0=0xd4
Section 1 .interp 0xd4+0x11=0xe5
000 0xe5+0x3=0xe8
Section 2 .hash 0xe8+0x104=0x1ec
Section 3 .dynsym 0x1ec+0x200=0x3ec
Section 4 .dynstr 0x3ec+0x11a=0x506
00 0x506+0x2=0x508
Section 5 .SUNW_version 0x508+0x20=0x528
Section 6 .rel.got 0x528+0x18=0x540
Section 7 .rel.bss 0x540+0x8=0x548
Section 8 .rel.plt 0x548+0x38=0x580
Section 9 .plt 0x580+0x80=0x600
Section 10 .text 0x600+0x1ec=0x7ec
Section 11 .init 0x7ec+0xd=0x7f9
Section 12 .fini 0x7f9+0x8=0x801
000 0x801+0x3=0x804
Section 13 .rodata 0x804+0x10=0x814
Section 14 .got 0x814+0x34=0x848
Section 15 .dynamic 0x848+0xb8=900
Section 16 .data 0x900+0x10=0x910
Section 17 .ctors 0x910+0x8=0x918
Section 18 .dtors 0x918+0x8=0x920
Section 19 .eh_frame 0x920+0x4=0x924
Section 20 .jcr 0x924+0x4=0x928
Section 21 .data.rel.local 0x928+0x4=0x92c
Section 22 .bss 0x92c+0x0=0x958
Section 23 .symtab 0x92c+0x540=0xe6c
Section 24 .strtab 0xe6c+0x20b=1077
Section 25 .comment 0x1077+0x24d=0x12c4
Section 26 .stab.index 0x12c4+0x24=0x12e8
Section 27 .shstrtab 0x12e8+0xdc=0x13c4
Section 28 .stab.indexstr 0x13c4+0x1c0=0x1584
Section header table 0x1584+0x488=0x1a0c ; 29×40=1160=0x488 这是依据Elf header的信息算得的
——————————————————
图 3-3 test5的ELF文件格局

# ls -al test5
-rwxr-xr-x 1 root other 6668 2004-12-19 06:56 test5

能够看到test5的巨细是0x1a0c字节,即6688字节。
能够看到,.bss section用于保存未初始化的大局变量,因而不占有ELF文件空间;
ELF文件装入时,会依照Section header table 22中的.bss的相关特点,为.bss映射相应巨细的内存空间,并初始化为0

ELF文件的Program header table描绘了如何将ELF装入内存:
Program Header 2 描绘了用户代码段的开始地址和巨细: 0x8050000+0x814=0x8050814
Program Header 3 描绘了用户数据段的开始地址和巨细: 0x8060814+0x144=0x8060958

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/jishu/260209.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部