看雪论坛
发新帖
1

[求助]请问为什么安卓ELF格式的so动态链接库的段(segment)可以重合?

holing 2017-6-10 04:46 634

最近在研究安卓的ELF动态链接库,网上看了一些资料,当我在用readelf查看某个样本安卓elf时,在Program Header里面发现了以下信息:

Program Headers:
  Type                    Offset       VirtAddr        PhysAddr      FileSiz     MemSiz  Flg Align
  PHDR                  0x000034 0x00000034 0x00000034 0x000e0 0x000e0 R   0x4
  LOAD                  0x000000 0x00000000 0x00000000 0x02138 0x02138 R E 0x1000
  LOAD                  0x002eb8 0x00003eb8 0x00003eb8 0x0014c 0x0014c RW  0x1000
  DYNAMIC           0x002ec4 0x00003ec4 0x00003ec4 0x000f8 0x000f8 RW  0x4
  GNU_STACK    0x000000 0x00000000 0x00000000 0x00000 0x00000 RW  0
  EXIDX                 0x002078 0x00002078 0x00002078 0x000c0 0x000c0 R   0x4
  GNU_RELRO    0x002eb8 0x00003eb8 0x00003eb8 0x00148 0x00148 RW  0x4

问题是,不同于windows的PE,在windows下所有区段都要以0x200对齐(ELF貌似没有这个限制?),而且区段不可能重合。

但在这里,明显第一个区段(PHDR)那个0x34-0x114就被包括在了第二个区段(LOAD)0x0-0x2138,而且Flg还自相矛盾:PHDR那个不可执行但是LOAD那个可以。。。

0x2eb8-0x3004的区段3(也是LOAD)也和DYNAMIC、GNU_RELRO重叠了。。。


这种重叠的区段在ELF中是允许的吗?那运行时在内存镜像中矛盾的Flg会被怎么处理呢?

查了好久也没找到相关说明。。。折腾我一天了。。实在没办法才来发帖问的。。有大神了解这方面的知识吗,或者哪里有相关资料吗?

感激不尽


本主题帖已收到 0 次赞赏,累计¥0.00
最新回复 (7)
yezhulove 2017-6-10 08:37
2
应该是只有LOAD会被加载,其他的不会。其次,区段是可以重叠(后面覆盖前面),有间隙的。对齐是的一般是PAGE_SIZE。
ckis 2017-6-10 10:49
3
样本发上来看看
十八垧 2017-6-10 12:06
4
linker只会加载load段,其它段如果需要被加载到内存中,就必须位于load段中。你可以这样理解,load段的信息是告诉linker,elf文件中的哪些内容需要映射到内存,而其它段的信息是方便linker去获取动态链接相关信息的。比如linker通过解析程序头表,获取到这里面的dynamic段的信息,定位到dynamic段,从中解析出各种诸如重定位表、字符串表等的位置信息等等。至于其它段的那些flg,我觉得忽略就好,没什么用处,不必深究。细节可以看linker源码。
1
holing 2017-6-10 17:21
5
ckis 样本发上来看看

so


上传的附件:
1
holing 2017-6-10 17:22
6
十八垧 linker只会加载load段,其它段如果需要被加载到内存中,就必须位于load段中。你可以这样理解,load段的信息是告诉linker,elf文件中的哪些内容需要映射到内存,而其它段的信息是方便li ...
好的谢谢,我再研究下
1
holing 2017-6-10 17:23
7
yezhulove 应该是只有LOAD会被加载,其他的不会。其次,区段是可以重叠(后面覆盖前面),有间隙的。对齐是的一般是PAGE_SIZE。
谢谢
龙飞雪 2017-9-11 15:04
8
yezhulove 应该是只有LOAD会被加载,其他的不会。其次,区段是可以重叠(后面覆盖前面),有间隙的。对齐是的一般是PAGE_SIZE。
“区段是可以重叠(后面覆盖前面)”  谢谢,突然明白了什么。。。
返回



©2000-2017 看雪学院 | Based on Xiuno BBS | 微信公众号:ikanxue
Time: 0.013, SQL: 10 / 京ICP备10040895号-17