为什么“.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 部分?我已经替换了所有标准段名称,可执行文件仍然按预期工作,因此程序加载代码不关心段名称

顺便说一句,是否可以在链接描述文件中完全排除节头,因为静态可执行文件不需要它。

注意:GNU 链接器会地将 .shstrtab 放入输出可执行文件中,即使它被丢弃。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)