微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么“.shstrtab”部分是强制性的?

如何解决为什么“.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 举报,一经查实,本站将立刻删除。