下面这段打印是读use_libhdca_util程序对应pid的map得到的打印:
00110000-00263000 r-xp 00000000 fd:00 2197259 /lib/libc-2.5.so 00263000-00264000 ---p 00153000 fd:00 2197259 /lib/libc-2.5.so 00264000-00266000 r--p 00153000 fd:00 2197259 /lib/libc-2.5.so 00266000-00267000 rw-p 00155000 fd:00 2197259 /lib/libc-2.5.so 00267000-0026a000 rw-p 00267000 00:00 0 0026a000-00275000 r-xp 00000000 fd:00 2197271 /lib/libgcc_s-4.1.2-20080825.so.1 00275000-00276000 rw-p 0000a000 fd:00 2197271 /lib/libgcc_s-4.1.2-20080825.so.1 0063b000-00656000 r-xp 00000000 fd:00 2197258 /lib/ld-2.5.so 00656000-00657000 r--p 0001a000 fd:00 2197258 /lib/ld-2.5.so 00657000-00658000 rw-p 0001b000 fd:00 2197258 /lib/ld-2.5.so 0073b000-0073c000 r-xp 0073b000 00:00 0 [vdso] 007b6000-007dd000 r-xp 00000000 fd:00 2197272 /lib/libm-2.5.so 007dd000-007de000 r--p 00026000 fd:00 2197272 /lib/libm-2.5.so 007de000-007df000 rw-p 00027000 fd:00 2197272 /lib/libm-2.5.so 007e1000-007e4000 r-xp 00000000 fd:00 2197268 /lib/libdl-2.5.so 007e4000-007e5000 r--p 00002000 fd:00 2197268 /lib/libdl-2.5.so 007e5000-007e6000 rw-p 00003000 fd:00 2197268 /lib/libdl-2.5.so 007fd000-00812000 r-xp 00000000 fd:00 2197262 /lib/libpthread-2.5.so 00812000-00813000 ---p 00015000 fd:00 2197262 /lib/libpthread-2.5.so 00813000-00814000 r--p 00015000 fd:00 2197262 /lib/libpthread-2.5.so 00814000-00815000 rw-p 00016000 fd:00 2197262 /lib/libpthread-2.5.so 00815000-00817000 rw-p 00815000 00:00 0 00d10000-00f00000 r-xp 00000000 fd:00 1606929 /root/ltc/test_exe_and_so/libhdca_util.so 00f00000-00f1b000 rw-p 001ef000 fd:00 1606929 /root/ltc/test_exe_and_so/libhdca_util.so 00f1b000-00f9e000 rw-p 00f1b000 00:00 0 04910000-049f0000 r-xp 00000000 fd:00 1222880 /usr/lib/libstdc++.so.6.0.8 049f0000-049f4000 r--p 000df000 fd:00 1222880 /usr/lib/libstdc++.so.6.0.8 049f4000-049f5000 rw-p 000e3000 fd:00 1222880 /usr/lib/libstdc++.so.6.0.8 049f5000-049fb000 rw-p 049f5000 00:00 0 08048000-08049000 r-xp 00000000 fd:00 1606930 /root/ltc/test_exe_and_so/use_libhdca_util 08049000-0804a000 rw-p 00000000 fd:00 1606930 /root/ltc/test_exe_and_so/use_libhdca_util 085ad000-085ce000 rw-p 085ad000 00:00 0 [heap] b7f2e000-b7f31000 rw-p b7f2e000 00:00 0 bf8bb000-bf8d0000 rw-p bffe9000 00:00 0 [stack]
各个字段的含义如下:
第一列:00110000-00263000-----本段内存映射的虚拟地址空间范围,对应vm_area_struct中的vm_start和vm_end。 第二列:r-xp ----此段虚拟地址空间的属性。每种属性用一个字段表示,r表示可读,w表示可写,x表示可执行,p和s共用一个字段,互斥关系,p表示私有段,s表示共享段,如果没有相应权限,则用’-’代替。 第三列:00000000----针对有名映射,指本段映射地址在文件中的偏移,对应vm_pgoff。对匿名映射而言,为vm_area_struct->vm_start。 第四列:fd:00----所映射的文件所属设备的设备号,对应vm_file->f_dentry->d_inode->i_sb->s_dev。匿名映射为0。其中fd为主设备号,00为次设备号。 第五列:2197259----文件的索引节点号,对应vm_file->f_dentry->d_inode->i_ino,与ls –i显示的内容相符。匿名映射为0。 第六列:/lib/libc-2.5.so ---所映射的文件名。对有名映射而言,是映射的文件名,对匿名映射来说,是此段内存在进程中的作用。[stack]表示本段内存作为栈来使用,[heap]作为堆来使用,其他情况则为无。
我们不难发现,有的so在这个列表中出现了多行,比如/lib/libpthread-2.5.so,它出现了四次(而且它后面还跟了一条没有文件名的):
007fd000-00812000 r-xp 00000000 fd:00 2197262 /lib/libpthread-2.5.so 00812000-00813000 ---p 00015000 fd:00 2197262 /lib/libpthread-2.5.so 00813000-00814000 r--p 00015000 fd:00 2197262 /lib/libpthread-2.5.so 00814000-00815000 rw-p 00016000 fd:00 2197262 /lib/libpthread-2.5.so 00815000-00817000 rw-p 00815000 00:00 0
可以看到,除了最后一行和下面没有文件名的那行权限一样,其他的权限都不一样,因为权限不同,不能合并。
下面具体分析下各行的含义:
第一行: 007fd000-00812000 r-xp 00000000 fd:00 2197262 /lib/libpthread-2.5.so 该r-xp条目描述了一块可执行内存(x权限标志)。这就是代码。 第二行: 00812000-00813000 ---p 00015000 fd:00 2197262 /lib/libpthread-2.5.so 该"---p"条目是两个LOAD区间中空闲的内存空间 第三行: 00813000-00814000 r--p 00015000 fd:00 2197262 /lib/libpthread-2.5.so 该r--p条目描述了一个只能读取的内存块(r权限标志)。那是静态数据(常量)。 第四行: 00814000-00815000 rw-p 00016000 fd:00 2197262 /lib/libpthread-2.5.so 该rw-p条目描述了一个可写的内存块(w权限标志)。这是用于库的全局变量。 第五行: 00815000-00817000 rw-p 00815000 00:00 0 该没有文件名的条目,实际上是上一个有文件名的(也就是/lib/libpthread-2.5.so)中.bss段的映射,因为一些全局为初始化变量是位于bss段的,它们并不在文件中占用空间,需要在加载时清零。所以做文件映射就不能实现该功能(因为文件里没有对应的内容),所以这里其实是映射到了一个匿名的私有空间,逻辑地址空间和前面的连续。