Какие части файла ELF нужно загружать в память?

Я пишу программу на c, которая получает файл elf, загружает его, а затем выполняет. Я прочитал все заголовки (elf, раздел, программа, перемещение). Следующая часть должна получить то, что будет загружено, верно?

Как мне продолжить? Насколько я понимаю, я должен получить либо разделы типа LOAD, ALLOC и EXECINST, либо сегменты программы типа LOAD? Или что?

Когда я получаю необходимые данные, я должен отобразить их в памяти с помощью mmap ().

Я уже много раз читал документацию по ELF, но все еще не знаю, что делать дальше. Любая помощь приветствуется.


person Invader Zim    schedule 30.05.2013    source источник
comment
Зачем это делать? Операционная система сделает это за вас. Просто запустите файл как программу (exec () для POSIX).   -  person Raedwald    schedule 30.05.2013
comment
Это спецификации проекта. Я не могу использовать exec (). Смысл этого проекта - ознакомление с эльф-файлами, загрузка и перемещение.   -  person Invader Zim    schedule 30.05.2013


Ответы (2)


Необходимо загрузить только PT_LOAD сегменты. Однако загрузка их для основной программы, которая может потребоваться для загрузки по фиксированному адресу, осложняется тем фактом, что ваш загрузчик может уже использовать часть или весь этот диапазон адресов для чего-то еще. Вы можете обмануть и дать своему загрузчику базовый адрес, отличный от «типичных» адресов основной программы, и надеяться, что он работает, или вы можете создать перемещаемый загрузчик, который перемещается по другому адресу.

person R.. GitHub STOP HELPING ICE    schedule 30.05.2013
comment
Значит, мне не нужно загружать ни один из разделов? Или у меня есть выбор между загрузкой разделов или сегментов, но не обоих сразу? Я бы определенно сделал перемещаемый загрузчик, так как я думаю, что он более безопасен? - person Invader Zim; 30.05.2013
comment
Для исполняемой программы важны только заголовки program (PT_*). Заголовки разделов даже не должны существовать; они предназначены для использования компоновщиком (обработка .o файлов) или отладчиком (в исполняемых файлах). - person R.. GitHub STOP HELPING ICE; 31.05.2013

Это делает сама операционная система. Просто нужно выполнить двоичный файл. Дополнительные сведения см. В исходном коде модуля динамического компоновщика Linux.

person akhil    schedule 30.05.2013
comment
Я новичок в Linux (два дня назад установил ubuntu). Где (или как) взять исходный код? - person Invader Zim; 30.05.2013
comment
Спасибо. Я приму ваш ответ, если это решит мои проблемы. [: - person Invader Zim; 30.05.2013