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

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

2015-2-2 16:38
56124

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

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


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

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

还望大神赐教,多谢!
2015-2-5 19:22
0
雪    币: 370
活跃值: (1180)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
11
额,小菜。。。
把手机的/system/lib目录下的依赖库复制出来
2015-2-5 23:09
0
雪    币: 91
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
这个我清楚,我想问复制到哪里去?是复制到运行环境,还是复制到编译环境?
2015-2-6 07:24
0
雪    币: 370
活跃值: (1180)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
13
这个都可以,只要保证二者统一即可。
2015-2-6 10:11
0
雪    币: 12
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
大神,你好,我在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);
2015-2-6 14:01
0
雪    币: 370
活跃值: (1180)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
15
额,小菜。。。。 你注意下内存,应该没什么问题。 我刚试了。
2015-2-13 19:34
0
雪    币: 207
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
感谢LZ分享~~~~~~~~~~~
2015-2-17 09:52
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
谢谢,学习中
2015-3-9 10:11
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
感谢分享
2015-3-29 21:03
0
雪    币: 47
活跃值: (43)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
19
密码对吗,怎么打不开呢
2015-4-24 11:14
0
雪    币: 8
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
谢谢分享
2015-9-3 20:09
0
雪    币: 118
活跃值: (72)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
21
这得mark,谢谢分享
2015-9-3 20:13
0
雪    币: 102
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
感谢楼主分享,冒昧问一句映射内存为啥要2次mmap呢?
2016-4-14 13:49
0
雪    币: 162
活跃值: (91)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
学习一下
2016-5-6 18:17
0
雪    币: 93
活跃值: (136)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
楼主提到的soinfo的next赋值然后加入solist中,我发现并不能加进去啊。
然后so文件成功映射到内存中,可以找到函数地址,然而进行调用也是失败的。
我怀疑是因为没有加入solist的原因。
楼主可以解答下吗?
2016-5-25 17:40
0
雪    币: 191
活跃值: (195)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
25
你问的问题太对啦,我也崩溃啊,是复制到哪里啊
2016-5-26 21:20
0
游客
登录 | 注册 方可回帖
返回
//