在过go 的几天里,我一直在阅读有关加载和链接的内容,我已经无数次地阅读到ELF文件中的Section头对于可执行文件来说不是必需的.我理解这对于静态链接的可执行文件是如何成立的,但我想知道这是否仍然适用于动态链接的可执行文件.

enter image description here

如本图所示,节标题表用于访问重定位节以及其他一些节.然后在动态链接过程中使用这些部分.这一点在article中也有说明,我在那里发现了这张图像.因此,我感到困惑的是,关于不需要SectionHeader的说法是否仍然有效,或者它是否仅适用于静态链接的可执行文件.

任何真知灼见都将不胜感激.谢谢.

推荐答案

我想知道这是否仍然适用于动态链接的可执行文件.

是:在动态加载过程中,截面not用于任何对象.

如本图所示,节标题表用于访问重定位节

这不是真的.要查找重新定位,使用PT_DYNAMIC segment(包含.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等足以找到必要的重置表.

Linux相关问答推荐

awk:try 将时间戳字符串转换为unix纪元时间

如何确定Linux上的最大静态TLS(线程本地存储)块大小?

在CefExecuteProcess;之前创建新线程会导致CEF应用程序崩溃并显示SIGTRAP

如何将netcdf文件列表中的特定变量添加到不同的文件中?

在新环境中使用Unicode范围的sed表达式有问题

Azure Linux B1s VM-Jenkins Sever已安装,但主页未打开

Linux:用户态线程在执行系统调用时是否有更高的优先级?

使用 AWK 过滤 Linux 输出

$RANDOM 变量在输出通过管道后似乎没有改变

使用 awk 从文件中检索一组特定的字符串

另一个远程的 Git 合并分支

如何在makefile中包含静态库

如何在 Linux 上捕获原始 HID 输入?

使用 awk 或 sed 删除特定字符

如何在 shell 脚本中只读取一个字符

Java 8 上的 SQL Server JDBC 错误:驱动程序无法使用安全套接字层 (SSL) 加密建立与 SQL Server 的安全连接

如何设置errno值?

如何运行时调试共享库?

可以通过 SSH 连接的所有用户的列表

将 jiffies 转换为毫秒