Перемещение ELF в разделяемом объекте вызывает ошибку сегментации - PullRequest
0 голосов
/ 08 ноября 2019

Я создал секционный 32-битный исполняемый файл ARM ELF с нуля в шестнадцатеричном редакторе, который вызывает две функции из glibc: printf для отображения «hello world» и выхода для завершения. Мне пришлось создать две записи перемещения REL для тех символов, которые содержат поле r_offset . Спецификация https://refspecs.linuxbase.org/elf/gabi4+/ch4.reloc.html описывает это поле следующим образом:

r_offset
Этот элемент указывает местоположение, в котором можно применить действие по перемещению. Для перемещаемого файла это смещение в байтах от начала раздела до единицы хранения, на которую влияет перемещение. Для исполняемого файла или общего объекта значением является виртуальный адрес блока хранения, на который влияет перемещение.

Когда я создаю EXEC (исполняемый файл) ELF, я знаю виртуальный адрес, на который перемещаетсядолжен подать заявку, и я могу запустить исполняемый файл. Изменяя тип ELF на DYN (общий объектный файл) (позиционно-независимый исполняемый файл), я получаю ошибку сегментации, потому что перемещения применяются после загрузки исполняемого файла на произвольный виртуальный адрес и, следовательно, r_offset указывает на область памяти, в которую невозможно записать.

Как создать правильные записи перемещения для типа DYN ELF?

шестнадцатеричный дамп ELF
информация из readelf

Разобранный машинный код:
добавьте r0, pc, # 0x18
mov lr, pc
ldr pc, [pc, # 8]
mov r0, # 0
mov lr, pc
ПК, [ПК]

...