问题描述
我正在编译这样的静态可执行文件:
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 (将#修改为@)