linux - 为什么“.shstrtab”部分是强制性的?
问题描述
我正在编译一个像这样的静态可执行文件:
ld.lld out/main.o -o out/sm -Tstatic.ld -static
strip --strip-all out/sm
这是我正在使用的链接器脚本:
ENTRY(_start)
SECTIONS
{
. = 0x100e8;
.all : {
*(.bss*)
*(.text*)
*(.data*)
*(.rodata*)
*(COMMON*)
} :code
.shstrtab : {
*(.shstrtab)
}
/DISCARD/ : {
*(*)
}
}
PHDRS
{
code PT_LOAD FILEHDR PHDRS ;
}
可执行文件按预期工作,但 strip 命令不会.shstrtab
从可执行文件中删除部分。
如果我.shstrtab
从链接描述文件中删除该部分,我会收到以下错误:
ld.lld out/main.o -o out/.sm -Tstatic.ld -static
ld.lld: error: discarding .shstrtab section is not allowed
为什么需要该.shstrtab
部分?我已经替换了所有标准节名,并且可执行文件仍然按预期工作,因此程序加载代码并不关心节名。
顺便说一句,是否可以在链接描述文件中完全排除节标题,因为静态可执行文件不需要它。
注意:.shstrtab
即使它被丢弃,GNU 链接器也会默默地放入输出可执行文件。
解决方案
为什么“.shstrtab”部分是强制性的?
节表中的每个节都有一个节名。它存储为对节名表 ( .shstrtab
) 的引用。
因此,只要 ELF 文件中至少有一个部分,就必须有一个.shstrtab
部分(但是,它的名称可能不同)。
实际上,它可以构建一个没有任何节的 ELF 文件(但只有程序头)。
但是,我从未见过这样一个由常规链接器链接的 ELF 文件(仅是有意创建为尽可能小或类似的文件)。
推荐阅读
- java - 从外部浏览器调用时的 HttpServletResponse 输出目标
- docker - 使用 docker 驱动程序在 minikube 中 Docker 本地私有注册表
- python - 为什么我的注册和登录系统在 python 中循环?
- java - 通过 WildFly 中的负载均衡器向 HornetQ 发送消息
- javascript - 如何在 JavaScript 中反转嵌套对象
- json - Flutter 错误:参数类型“动态”不能分配给参数类型“Iterable”
' - gnuplot - splitting a number into the integer and decimal parts GNUPLOT
- c# - Backus-Naur 形式的正则表达式
- javascript - PugJS 没有从 json 插入数字
- kotlin - 枚举的函数 vararg 参数
在科特林