Тебе ж 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