ELF 的解析

2018-06-19 21:37:45 +08:00
 Lwf1995

本人想问一下,section 和 segment 是如何映射的,是根据偏移地址么。比如 segment1 的地址是 0x40,segment2 的地址是 0x238。那么 section 的偏移地址在 0x40 和 0x238 之间的属于 segment1,是这样理解么

3487 次点击
所在节点    Linux
5 条回复
misaka19000
2018-06-19 22:02:59 +08:00
如果指的是在内存中的地址的话应该没错吧
WordTian
2018-06-19 22:31:15 +08:00
这种偏二进制的问题,感觉还是去看雪问更靠谱一点
BXLR
2018-06-19 23:00:45 +08:00
找到 dyn 段 看看
nccer
2018-06-20 15:32:22 +08:00
一般来说,一个 ELF 文件要么有节没段,要么有段没节。可重定向文件里面是节,可执行文件里是段。可执行文件里的段的内容可以散落在不同的可重定向文件的节里面,然后通过重定向收集到一个段里面。
比如,你写了一个小程序,包含两个.c 文件,这两个.c 文件里面都各有一个字符串。你把这两个.c 文件分别编译成.o 文件再链接成一个 a.out 可执行文件。显然,在.o 文件里这两个字符串分别在不同的节里面,但是一旦链接成 a.out 文件,这两个字符串又都会被收集到一个段里面。然后映射关系是重定向过程中通过偏移量算出来的,不是像你说的那样直接映射。
wadahana
2018-06-20 17:02:34 +08:00
ld 加载到内存的时候是按照 segment 映射,实际上只会 map segment 中的 LOAD 到内存,不在 LOAD 范围内的 section 在内存视图中是找不到的,

section 其实只是提供一个从文件偏移的角度来解析 elf 文件,剥离 section 信息不影响 elf 文件的加载

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/464223

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX