ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
29 марта
1036924 Топик полностью
fk0, легенда (15.09.2020 22:41, просмотров: 556) ответил Aleksey_75 на а можно пример как это делается в GCC ?? я с DYNAMIC_RELOCATION_TABLE фактически разобрался, осталось понять как определить что переменная в озу. Прога вписывания новых адресов получается копеечная
Тебе ж 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]