ВходНаше всё Теги codebook PARTS Поиск Опросы Закон Суббота
26 сентября
/1036924
Топик полностью
fk0 (15.09.2020 22:41, просмотров: 80) в ответ на а можно пример как это делается в GCC ?? я с DYNAMIC_RELOCATION_TABLE фактически разобрался, осталось понять как определить что переменная в озу. Прога вписывания новых адресов получается копеечная - автор: Aleksey_75
Тебе ж LightElf давал ссылку на загрузчик ELF'ов. Кто у кого скопипастил я не разобрался, сам разбирайся. Там что-то кода много накручено, можно проще. В конечном счёте нужно записать в нужное место flash секцию .text, скопировать .data в ОЗУ (и каждый раз при старте), занулить .bss, потом пробежаться по таблице релокаций и пофиксить релокации в .data, потом пробежаться по таблице символов и зарезолвить неизвестные символы (что модуль вызывает из твоей программы). Заодно 

узнать известные символы (тебе ж нужно из модуля функции какие-то вызывать). И узнать функцию которую нужно вызывать для инициализации и вызвать (там C++-конструкторы и всякое такое, ну и твой код инициализации). Оно маленькое, но код я тебе сейчас сходу не найду. Самому написать реально полезно будет, много нового для себя откроешь. Ну а с GCC тупо нужно скомпилировать с -fPIC и слинковать с -shared. При этом можно подсунуть ELF с основной программой, чтоб оно оттуда символы взяло, что они вообще такие в будущем будут -- чтоб не натыкаться на кейс, когда при загрузке символы не найдены. Да, --no-undefined при линковке настоятельно рекомендую.

https://github.com/martinribelotta/elfloader

https://github.com/embedded2014/elf-loader

[ZX]
Ответить
Ответы