动态链接的ELF文件是否需要ELF节头表?

3
我在过去的几天里一直在阅读有关加载和链接的内容,我已经无数次地看到说 ELF 文件中的节头对于可执行文件来说并不是必需的。我理解这对于静态链接的可执行文件可能是正确的,但我想知道对于动态链接的可执行文件是否仍然适用。

enter image description here

如图所示,节头表用于访问重定位节以及其他一些节。这些节在动态链接过程中被使用。这也在文章中提到,我在那里找到了这张图片。因此,我对是否仍然需要节头的说法感到困惑,或者它只适用于静态链接的可执行文件。
如果有任何见解,将不胜感激。谢谢。

为了测试我的问题,我用空字节替换了一个动态链接的可执行文件中的节头,并发现可执行文件能够正常运行。我猜这表明你不需要节头,但现在我对动态链接的工作原理更加困惑了。 - Will Rosenberg
为了测试我的问题,我用空字节替换了一个动态链接的可执行文件中的节头,并发现可执行文件能够正常运行。我猜这表明你不需要节头,但现在我对动态链接的工作原理更加困惑了。 - undefined
1个回答

2
我想知道这是否仍然适用于动态链接的可执行文件。
是的:在动态加载期间,节段不被用于任何功能。
如图所示,"节头表" 用于访问重定位节。
那不是真的。要找到重定位,使用 "PT_DYNAMIC" 段(包含 ".dynamic" 节)。例如:
readelf -d /bin/date

Dynamic section at offset 0x1cdb8 contains 26 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000000000000c (INIT)               0x3000
 0x000000000000000d (FINI)               0x15140
 0x0000000000000019 (INIT_ARRAY)         0x1c1f0
 0x000000000000001b (INIT_ARRAYSZ)       8 (bytes)
 0x000000000000001a (FINI_ARRAY)         0x1c1f8
 0x000000000000001c (FINI_ARRAYSZ)       8 (bytes)
 0x000000006ffffef5 (GNU_HASH)           0x3a0
 0x0000000000000005 (STRTAB)             0xbc8
 0x0000000000000006 (SYMTAB)             0x400
 0x000000000000000a (STRSZ)              977 (bytes)
 0x000000000000000b (SYMENT)             24 (bytes)
 0x0000000000000015 (DEBUG)              0x0
 0x0000000000000003 (PLTGOT)             0x1cfe8
 0x0000000000000002 (PLTRELSZ)           1584 (bytes)
 0x0000000000000014 (PLTREL)             RELA
 0x0000000000000017 (JMPREL)             0x2238
 0x0000000000000007 (RELA)               0x10e0
 0x0000000000000008 (RELASZ)             4440 (bytes)
 0x0000000000000009 (RELAENT)            24 (bytes)
 0x000000006ffffffb (FLAGS_1)            Flags: PIE
 0x000000006ffffffe (VERNEED)            0x1040
 0x000000006fffffff (VERNEEDNUM)         1
 0x000000006ffffff0 (VERSYM)             0xf9a
 0x000000006ffffff9 (RELACOUNT)          171
 0x0000000000000000 (NULL)               0x0

在这里,DT_PLTGOTDT_PLTRELSZDT_RELADT_RELASZ等足以找到必要的重定位表。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接