Линейный загрузчик ELF для Linux
Мне нужно сделать довольно необычную вещь: вручную выполнить исполняемый файл эльфа. То есть загружать все разделы в нужные места, запрашивать main() и вызывать его (и затем очищать). Исполняемые файлы будут статически связаны, поэтому нет необходимости связывать библиотеки. Я также управляю базовым адресом, поэтому не беспокойтесь о возможных конфликтах.
Итак, существуют ли для этого библиотеки?
Я нашел OSKit и его liboskit_exec, но проект кажется мертвым с 2002 года.
Я в порядке с частью проектов (уважая лицензии, конечно) и подгоняю их к моей потребности, но поскольку я совершенно нул в мире Linux, я даже не знаю, где найти эти части!:)
PS. Мне нужно это для платформы ARM.
UPD Ну, вопрос загрузки эльфов, похоже, требует хороших знаний об этом (вздох), поэтому я прочел некоторые спецификации и руководства. И я думаю, что буду придерживаться бионического/линкера и libelfsh. Спасибо, парни!
Подводя итоги:
Ответы
Ответ 1
Быстрый apt-cache search
предлагает libelf1
, libelfg0
и/или libelfsh0
. Я думаю, что программа elfsh
(в пакете тезка) может быть интересным практическим примером использования libelfsh0
.
Я сам не пробовал, но надеюсь, что они будут полезны. Удачи: -)
Ответ 2
Google Android, в нем "бионная" реализация libc, имеет полностью переопределенный загрузчик ELF. Это разумно чистый и, вероятно, лучший источник, чем gilbc, если вы ищете что-то простое.
Ответ 3
Посмотрите libelf для чтения исполняемого файла. У вас будут проблемы с этим, я думаю.
Похоже, поскольку вам не нужны библиотеки ни для чего, почему бы не просто mmap ваш исполняемый файл, установить данные о различных областях памяти и jmp/b в?
Я не знаю, имеет ли ARM эквивалент NX-бит, но стоит проверить.
Ответ 4
Этот инструмент содержит загрузчик ELF: http://bitwagon.com/rtldi/rtldi.html
Я повторно использовал код из rtldi для цепного загрузчика ELF в другом проекте. Код здесь: http://svn.gna.org/viewcvs/plash/trunk/chroot-jail/elf-chainloader/?rev=877
, и здесь есть несколько фона: http://plash.beasts.org/wiki/Story16
. (По-видимому, мне приходится нарушать эти ссылки, потому что stackoverflow не позволяет мне отправлять > 1 ссылку!)