首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
Coding
V2EX  ›  Linux

ELF 的解析

  •  
  •   Lwf1995 · 2018-06-19 21:37:45 +08:00 · 2157 次点击
    这是一个创建于 541 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    5 回复  |  直到 2018-06-20 17:02:34 +08:00
        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 文件的加载
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2601 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 24ms · UTC 13:39 · PVG 21:39 · LAX 05:39 · JFK 08:39
    ♥ Do have faith in what you're doing.