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

ELF 的解析

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

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

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

    section 其实只是提供一个从文件偏移的角度来解析 elf 文件,剥离 section 信息不影响 elf 文件的加载
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4002 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 10:18 · PVG 18:18 · LAX 02:18 · JFK 05:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.