Порядок сегмента PT_INTERP в исполняемом ELF - PullRequest
1 голос
/ 23 марта 2020

Спецификация ELF http://www.skyfree.org/linux/references/ELF_Format.pdf на стр. 2-3 гласит запись заголовка программы с p_type = PT_INTERP, что она должна предшествовать любой загружаемой записи сегмента .

Я хотел бы знать, относится ли это правило к

1) порядку этой записи в таблице заголовков программы,

или 2) позиции необработанного содержимого (строка с путем фактическому интерпретатору) в макете файла

или 3) оба.

GNU linker ld , кажется, следует 3). Заголовок программы, создаваемый ld , генерирует PT_PHDR, затем PT_INTERP, затем PT_LOAD, и фактическая строка интерпретатора генерируется сразу после заголовка программы, перед любым кодом и содержимым данных. Он также (излишне?) Создает специальную запись раздела .interp в заголовках разделов с sh_type = SHT_PROGBITS, которая дублирует запись заголовка программы PT_INTERP.

В моем компоновщике я хотел бы объединить строку пути INTERP с содержимым .strtab и .shstrtab где-то ближе к концу файла, потому что все эти три раздела выровнены по байтам, что избавит от необходимости выравнивания и уменьшит размер выходного файла. Тем не менее, я не уверен, не нарушает ли это спецификацию ELF, так как я asp.

1 Ответ

2 голосов
/ 24 марта 2020

Я считаю, что:

  1. Ответ: 1) - PT_INTERP должно предшествовать PT_LOAD с в таблице заголовков программы.
  2. Это требование, скорее всего, устарело (по крайней мере для Linux) - ядро ​​выполняет итерации по всем заголовкам программы в fs / binfmt_elf. c ищет PT_INTERP, и, похоже, это не волнует где в таблице появляется эта запись.

В моем компоновщике я хотел бы объединить строку пути INTERP с содержимым .strtab и .shstrtab где-то в конце файла

Это должно работать нормально (но я не пробовал).

...