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


person fctorial    schedule 14.01.2021    source источник


Ответы (1)


Почему раздел «.shstrtab» является обязательным?

Каждый раздел в таблице разделов имеет имя раздела. Он хранится как ссылка на таблицу имен разделов (.shstrtab).

Таким образом, пока в файле ELF есть хотя бы один раздел, должен быть раздел .shstrtab (однако он может называться по-другому).

Действительно, было бы позволено построить файл ELF без каких-либо разделов (но только с заголовками программ).

Однако я никогда не видел такого файла ELF, связанного обычным компоновщиком (только файлы, которые были намеренно созданы, чтобы быть как можно меньше или похожи).

person Martin Rosenau    schedule 14.01.2021