本人想问一下,section 和 segment 是如何映射的,是根据偏移地址么。比如 segment1 的地址是 0x40,segment2 的地址是 0x238。那么 section 的偏移地址在 0x40 和 0x238 之间的属于 segment1,是这样理解么
1
misaka19000 2018-06-19 22:02:59 +08:00
如果指的是在内存中的地址的话应该没错吧
|
2
WordTian 2018-06-19 22:31:15 +08:00 via Android
这种偏二进制的问题,感觉还是去看雪问更靠谱一点
|
3
BXLR 2018-06-19 23:00:45 +08:00 via iPhone
找到 dyn 段 看看
|
4
nccer 2018-06-20 15:32:22 +08:00
一般来说,一个 ELF 文件要么有节没段,要么有段没节。可重定向文件里面是节,可执行文件里是段。可执行文件里的段的内容可以散落在不同的可重定向文件的节里面,然后通过重定向收集到一个段里面。
比如,你写了一个小程序,包含两个.c 文件,这两个.c 文件里面都各有一个字符串。你把这两个.c 文件分别编译成.o 文件再链接成一个 a.out 可执行文件。显然,在.o 文件里这两个字符串分别在不同的节里面,但是一旦链接成 a.out 文件,这两个字符串又都会被收集到一个段里面。然后映射关系是重定向过程中通过偏移量算出来的,不是像你说的那样直接映射。 |
5
wadahana 2018-06-20 17:02:34 +08:00
ld 加载到内存的时候是按照 segment 映射,实际上只会 map segment 中的 LOAD 到内存,不在 LOAD 范围内的 section 在内存视图中是找不到的,
section 其实只是提供一个从文件偏移的角度来解析 elf 文件,剥离 section 信息不影响 elf 文件的加载 |