Я компилирую статический исполняемый файл следующим образом:
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
в выходной исполняемый файл, даже если он отбрасывается.