猿问
下载APP

ELF文件格式中节和段的区别是什么

ELF文件格式中节和段的区别是什么

来自wiki 可执行文件和可链接格式

这些段包含运行时执行文件所必需的信息,而段包含用于链接和重定位的重要数据。整个文件中的任何字节最多只能由一个部分拥有,并且可能存在不属于任何部分的孤立字节。

但是段和段之间有什么区别?在可执行的ELF文件中,段是否包含一个或多个部分?


幕布斯5086720
浏览 77回答 2
2回答

素胚勾勒不出你

但是段和段之间有什么区别?正是您所引用的内容:段包含运行时所需的信息,而这些段包含链接期间所需的信息。一个细分包含一个或多个部分?一个段可以包含0个或更多节。例:readelf -l /bin/dateElf file type is EXEC (Executable file)Entry point 0x402000There are 9 program headers, starting at offset 64Program Headers:  Type           Offset             VirtAddr           PhysAddr                 FileSiz            MemSiz              Flags  Align  PHDR           0x0000000000000040 0x0000000000400040 0x0000000000400040                 0x00000000000001f8 0x00000000000001f8  R E    8  INTERP         0x0000000000000238 0x0000000000400238 0x0000000000400238                 0x000000000000001c 0x000000000000001c  R      1      [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]  LOAD           0x0000000000000000 0x0000000000400000 0x0000000000400000                 0x000000000000d5ac 0x000000000000d5ac  R E    200000  LOAD           0x000000000000de10 0x000000000060de10 0x000000000060de10                 0x0000000000000440 0x0000000000000610  RW     200000  DYNAMIC        0x000000000000de38 0x000000000060de38 0x000000000060de38                 0x00000000000001a0 0x00000000000001a0  RW     8  NOTE           0x0000000000000254 0x0000000000400254 0x0000000000400254                 0x0000000000000044 0x0000000000000044  R      4  GNU_EH_FRAME   0x000000000000c700 0x000000000040c700 0x000000000040c700                 0x00000000000002a4 0x00000000000002a4  R      4  GNU_STACK      0x0000000000000000 0x0000000000000000 0x0000000000000000                 0x0000000000000000 0x0000000000000000  RW     8  GNU_RELRO      0x000000000000de10 0x000000000060de10 0x000000000060de10                 0x00000000000001f0 0x00000000000001f0  R      1 Section to Segment mapping:  Segment Sections...   00        01     .interp    02     .interp .note.ABI-tag .note.gnu.build-id .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt .init .plt .text .fini .rodata .eh_frame_hdr .eh_frame    03     .ctors .dtors .jcr .dynamic .got .got.plt .data .bss    04     .dynamic    05     .note.ABI-tag .note.gnu.build-id    06     .eh_frame_hdr    07        08     .ctors .dtors .jcr .dynamic .got 这里,PHDR段包含0个部分,INTERP段包含.interp部分,第一个LOAD段包含一大堆部分。进一步阅读与一个很好的例证。

动漫人物

Section包含链接器的静态,用于OS的段动态数据引用是正确的,但要真正理解它的区别,您应该尝试理解节头和程序头(段)条目的字段,以及链接器(节)和操作系统(段)如何使用它们。特别重要的信息是(除了长度):section:告诉链接器一个部分是否:原始数据被加载到存储器,例如.data,.text等或格式化的元数据有关的其它部分中,将由连接器被使用,但在运行时例如消失.symtab,.srttab,.rela.textsegment:告诉操作系统:应将段加载到虚拟内存中的哪个位置段具有哪些权限(读取,写入,执行)。我已经编写了一个教程,更详细地介绍了这一点:http://www.cirosantilli.com/elf-hello-world/一个细分包含一个或多个部分吗?是的,链接器将节放入段中。在Binutils中,如何将段放入段中由ld称为链接描述文件的文本文件确定。文档:https://sourceware.org/binutils/docs/ld/Scripts.html您可以使用默认的一个ld --verbose,并设置自定义的一个-T。例如,我的默认Ubuntu 17.04链接描述文件包含:  .text           :                                                                                                                                                                {                                                                                                                                                                                  *(.text.unlikely .text.*_unlikely .text.unlikely.*)                                                                                                                              *(.text.exit .text.exit.*)                                                                                                                                                       *(.text.startup .text.startup.*)                                                                                                                                                 *(.text.hot .text.hot.*)                                                                                                                                                         *(.text .stub .text.* .gnu.linkonce.t.*)                                                                                                                                                                                                                                                                                                  }它告诉链接器将命名节.text.unlikely,.text.*_unlikely,.text.exit,等的.text部分。操作系统开发是自定义脚本很有用的一种情况,最小例子:https://github.com/cirosantilli/x86-bare-metal-examples/blob/d217b180be4220a0b4a453f31275d38e697a99e0/linker.ld一旦链接了可执行文件,只有链接器在可执行文件中存储可选节标题,才能知道哪个节转到哪个节
打开App,查看更多内容
随时随地看视频慕课网APP
我要回答