首页
社区
课程
招聘
[求助]so各个段与/proc/XXX/maps下的信息对应情况
发表于: 2016-3-10 15:01 4480

[求助]so各个段与/proc/XXX/maps下的信息对应情况

2016-3-10 15:01
4480
so被加载的时候各个段以及header都会被加载到内存吧?
通过/proc/XXX/maps查看so的内存地址情况的时候对应关系是什么呢?header会被加载到什么地方?

比如/proc/XXX/maps的输出如下:
root@mako:/proc/13090 # cat maps | grep "libtest.so"                       
73187000-7318a000 r-xp 00000000 b3:17 309538     /data/app-lib/com.example.test-2/libtest.so
7318a000-7318b000 r--p 00002000 b3:17 309538     /data/app-lib/com.example.test-2/libtest.so
7318b000-7318c000 rw-p 00003000 b3:17 309538     /data/app-lib/com.example.test-2/libtest.so

libtest.so的程序头如下:
程序头:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  *** Align
  PHDR           0x000034 0x00000034 0x00000034 0x000e0 0x000e0 R   0x4
  LOAD           0x000000 0x00000000 0x00000000 0x026d7 0x026d7 R E 0x1000
  LOAD           0x002e74 0x00003e74 0x00003e74 0x00190 0x00190 RW  0x1000
  DYNAMIC        0x002e84 0x00003e84 0x00003e84 0x00100 0x00100 RW  0x4
  GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x00000 RW  0
  EXIDX          0x002548 0x00002548 0x00002548 0x000e0 0x000e0 R   0x4
  GNU_RELRO      0x002e74 0x00003e74 0x00003e74 0x0018c 0x0018c RW  0x4

Section to Segment mapping:
  段节...
   00     
   01     .dynsym .dynstr .hash .rel.dyn .rel.plt .plt .text .mytext .ARM.extab .ARM.exidx .rodata
   02     .fini_array .init_array .dynamic .got .data
   03     .dynamic
   04     
   05     .ARM.exidx
   06     .fini_array .init_array .dynamic .got

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 1787
活跃值: (340)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
只有LOAD的会被加载,之所以会有3段,是因为第二个LOAD加载完成之后,内存属性被改了,所以就出现三段。
2016-3-10 15:26
0
雪    币: 15
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
额。。。不太明白内存属性被改了为什么会另外多出一段?能详细解释下吗,谢谢哈
另外,ELF的header为什么也会被加载到内存中?
2016-3-10 15:39
0
雪    币: 1787
活跃值: (340)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
map 显示的问题,他把读写的内存分开了。

加载地址你要看LOAD的属性。

LOAD           0x000000 0x00000000 0x00000000 0x026d7 0x026d7 R E 0x1000

RVA 是 0,文件偏移是0,加载基址是73187000, 大小是3000(26d7对齐到页边界)(因为文件便宜是0,所以文件头就被映射进去了)

LOAD           0x002e74 0x00003e74 0x00003e74 0x00190 0x00190 RW  0x1000
RAV 是 3000(3e74下对齐),加上基址73187000,所以加载到内存是7318a000. 0xe74 + 0x190 = 0x1004, 上对齐为0x2000,也就是下面两个大小的和。具体细节参看linker代码
7318a000-7318b000 r--p 00002000 b3:17 309538     /data/app-lib/com.example.test-2/libtest.so
7318b000-7318c000 rw-p 00003000 b3:17 309538     /data/app-lib/com.example.test-2/libtest.so
2016-3-10 19:01
0
雪    币: 15
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
明白了,多谢!
2016-3-14 10:50
0
游客
登录 | 注册 方可回帖
返回
//