Ну так это "Если адрес заранее не известен", то все сложно. Если же адрес в RAM известен заранее то всё резко упрощается. Поз. независимый код уже не обязателен, линкер может настроить код для работы по адресу загрузки в RAM. Из флэша такой код работать не сможет, а после переноса в ОЗУ - пожалуйста. Называется ramfunc.
Перенести код из флэшь в ОЗУ можно или при старте программы, одновременно с инициализацией переменных или отложить это дело на потом. Потом это придется делать вручную, но зато таких функций можно иметь несколько и менять по мере надобности. Это ещё одно умное слово для гугления: оверлей.
Жизнь есть способ существования белковых тел в борьбе со вторым началом термодинамики.