我在过去的几天里一直在阅读有关加载和链接的内容,我已经无数次地看到说 ELF 文件中的节头对于可执行文件来说并不是必需的。我理解这对于静态链接的可执行文件可能是正确的,但我想知道对于动态链接的可执行文件是否仍然适用。
如图所示,节头表用于访问重定位节以及其他一些节。这些节在动态链接过程中被使用。这也在文章中提到,我在那里找到了这张图片。因此,我对是否仍然需要节头的说法感到困惑,或者它只适用于静态链接的可执行文件。
如果有任何见解,将不胜感激。谢谢。
如果有任何见解,将不胜感激。谢谢。
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_PLTGOT
、DT_PLTRELSZ
、DT_RELA
、DT_RELASZ
等足以找到必要的重定位表。