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