首页 文章

ELF文件中的程序头和节头

提问于
浏览
0

这是一个问题的重复,但我无法快速找到我的问题的答案 . 这就是为什么要问它 .

一些ELF文件包含(可执行文件或共享库)程序头,用于解释段 . 它们包含一个称为虚拟地址和文件偏移以及其他一些字段的字段 .

还有相应的部分解释“内存中的地址”和文件偏移 .

现在我对部分和细分如何相关感到困惑 . (对于静态编译的可执行文件和非静态编译的可执行文件 . )静态编译的二进制文件的文件偏移量有何不同?程序头中的虚拟地址与节头中的内存地址之间是否存在任何关系 .

谢谢

1 回答

  • 0

    节是文件的最小连续区域 . 所以ELF文件被细分为几个部分 . 段不能重叠,也就是说,没有字节可能是多个段的一部分 . 但是可能存在不属于任何部分的字节("garbage") .

    部分通常用于链接目的 . 它们包含文件的不同部分,可以通过链接器重新排列,合并等 .

    但是可执行文件也可以包含部分 - 描述文件的内容,以及每段代码或数据的开始位置 . 共享对象也使用部分 . 那些包含用于动态链接的符号表和类似的东西 .

    ELF文件中包含的所有部分都在Section Headers Table中描述,每个部分都有一个条目 .

    但是为了制作可执行文件,你还需要其他东西:细分 . 这些告诉加载器应该将文件的哪些部分加载到内存和哪些地址 . 因此,段映射到可执行进程的内存空间 . 它们可以包含代码和数据,因此 segments can be subdivided into sections 可以实现这一点 . 我想这就是你问题的答案 .

    可加载段在程序 Headers 表中描述 .

    长话短说:
    在可执行文件中,您有段,可以进一步细分为多个部分 . 段以相反的方式加载到流程中:部分是必需的,因为它们描述了文件中的内容并允许链接 .


    至于内存地址和内容:
    在现代系统中,只有虚拟地址很重要 . 一个进程被操作系统欺骗,它在内存中单独运行,整个地址空间可用(尽管由于物理内存限制,并非所有地址空间都可以同时使用) . 系统将虚拟地址动态映射到物理地址,对进程透明 .

    不使用物理地址,因此它们可以保留为零,但可以设置为相同的地址以防万一 .

相关问题