首页
社区
课程
招聘
[原创]SO文件格式及linker机制学习总结(1)
2015-2-2 16:38 55076

[原创]SO文件格式及linker机制学习总结(1)

2015-2-2 16:38
55076
学习SO文件格式和linker已有很长一段时间,现实现SO文件的抽取以及相应的加载器,目的在于学习总结,并对之前帖子未涉及到的知识进行补充。当然,为了让总结更有意思,先从文件格式的定义上入手,自定义一个简单的文件格式。为了保持平台上的兼容性和实现的简单性,在对SO抽取的过程中,保持与指令集相关的相对结构,不涉及与平台相关的指令集重定位等。后文在此格式基础上,实现一个类似linker的加载器,对抽取后的SO文件进行加载。限于水平,难免会有错误和疏漏之处,请各位大大斧正。

另外,限于篇幅,后续文章将会介绍如何内存加载SO文件以及融合加载器的实现,目的在于将加载器与抽取后的文件相融合,实现无缝加载和替换......
-------------------------------------------------
附件为测试源码,解压密码:ThomasKing.2015.02.01

阿里云助力开发者!2核2G 3M带宽不限流量!6.18限时价,开 发者可享99元/年,续费同价!

上传的附件:
收藏
点赞4
打赏
分享
最新回复 (42)
雪    币: 2321
活跃值: (4028)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
熊猫正正 9 2015-2-2 17:01
2
0
谢谢分享,学习
雪    币: 114
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jimdlf 2015-2-2 17:04
3
0
MARK下 学习下
雪    币: 7
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
fanfu 2015-2-2 17:54
4
0
好帖,这个必得顶,跟着
ThomasKing的步伐走
雪    币: 107
活跃值: (311)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Fido 2015-2-2 19:52
5
0
学习...感谢楼主分享
雪    币: 76
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mingxuan三千 2015-2-2 22:37
6
0
感谢分享
雪    币: 188
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
JackJoker 2015-2-3 00:03
7
0
多谢分享,学习
雪    币: 250
活跃值: (251)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
OnlyEnd 2015-2-4 18:10
8
0
王总碉堡了!!!  下下来学习学习
雪    币: 18
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
flyworm 2015-2-5 11:44
9
0
感谢分享
雪    币: 91
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
sendwave 2015-2-5 19:22
10
0
请教大神:我今天直接测试demo失败了,于是到“SO文件抽取”里面重新编译和运行,结果Mini_elf_generate崩溃了。
目录里面的txt说:需要从特定手机复制依赖库。请问这里是不是说将目标手机中的对应依赖so文件复制到Mini_elf_generate编译环境(Linux)中?还是说复制到Android手机Demo运行的目录下?

还望大神赐教,多谢!
雪    币: 370
活跃值: (1181)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
ThomasKing 6 2015-2-5 23:09
11
0
额,小菜。。。
把手机的/system/lib目录下的依赖库复制出来
雪    币: 91
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
sendwave 2015-2-6 07:24
12
0
这个我清楚,我想问复制到哪里去?是复制到运行环境,还是复制到编译环境?
雪    币: 370
活跃值: (1181)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
ThomasKing 6 2015-2-6 10:11
13
0
这个都可以,只要保证二者统一即可。
雪    币: 12
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xiaomayu 2015-2-6 14:01
14
0
大神,你好,我在Ubuntu12.0.4下编译so文件抽取,但是异常退出了,我跟日志跟进了Mini_elf_generate.c文件,异常在下面几行代码,请大神指点迷津。

     memcpy(f_hash, new_hash, (2 + new_nbuckets + new_nchains) * 4);
      f_rel = (Elf32_Rel*)(f_hash + 2 + new_nbuckets + new_nchains);
      memcpy(f_rel, new_rel, sizeof(Elf32_Rel) * new_rel_count);
      f_pltrel = (Elf32_MiniPltRel*)((unsigned)f_rel + sizeof(Elf32_Rel) * new_rel_count);
      memcpy(f_pltrel, tRel, sizeof(Elf32_MiniPltRel) * tRel_count);
      plt_offset = (unsigned)(si->plt_rel + si->plt_rel_count) - si->base;
      memcpy(base + plt_offset, (void*)si->base + plt_offset, si->size - plt_offset);
雪    币: 370
活跃值: (1181)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
ThomasKing 6 2015-2-13 19:34
15
0
额,小菜。。。。 你注意下内存,应该没什么问题。 我刚试了。
雪    币: 207
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
handsome枫雪 2015-2-17 09:52
16
0
感谢LZ分享~~~~~~~~~~~
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wangfeitw 2015-3-9 10:11
17
0
谢谢,学习中
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tljabc 2015-3-29 21:03
18
0
感谢分享
雪    币: 47
活跃值: (43)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
chitcrazy 2015-4-24 11:14
19
0
密码对吗,怎么打不开呢
雪    币: 8
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
SnowNight 2015-9-3 20:09
20
0
谢谢分享
雪    币: 118
活跃值: (72)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
dalerkd 1 2015-9-3 20:13
21
0
这得mark,谢谢分享
雪    币: 102
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zhengweird 2016-4-14 13:49
22
0
感谢楼主分享,冒昧问一句映射内存为啥要2次mmap呢?
雪    币: 162
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ugene 2016-5-6 18:17
23
0
学习一下
雪    币: 93
活跃值: (136)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
gugubupt 2016-5-25 17:40
24
0
楼主提到的soinfo的next赋值然后加入solist中,我发现并不能加进去啊。
然后so文件成功映射到内存中,可以找到函数地址,然而进行调用也是失败的。
我怀疑是因为没有加入solist的原因。
楼主可以解答下吗?
雪    币: 191
活跃值: (195)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
大王叫我挖坟 3 2016-5-26 21:20
25
0
你问的问题太对啦,我也崩溃啊,是复制到哪里啊
游客
登录 | 注册 方可回帖
返回