Отметьте это примечание к приложению .В нем подробно описывается, как работает динамическое связывание и что нужно сделать, чтобы написать собственный динамический загрузчик.Это также дает некоторые альтернативы этому.Я думаю, что таблицы переходов достаточно легко реализовать, и они решат вашу проблему с изменением адресов API.
Редактировать : Вот как сделать простую таблицу переходов.Сначала решите, какие функции вам нужно экспортировать из вашей основной программы.Затем создайте структуру указателей на функции:
typedef struct _MyAPI
{
int (*init)(int flags);
int (*exit)(int exitcode);
void * (*getmem)(size_t size);
void (*freemem)(void *ptr);
} MyAPI;
В основной программе определите экземпляр этой структуры, заполните указатели и поместите его по какому-либо предопределенному адресу:
#include <jumptbl.h>
int main_init(int flags)
{
return 0;
}
//...
MyAPI main_API __attribute__((section(".jumptbl"))) =
{
&main_init,
&main_exit,
&main_getmem,
&main_freemem,
};
(если вы используете этот подход, вам нужно будет описать раздел .jumptbl в файле компоновщика и убедиться, что он получает фиксированный адрес)
В загруженном модуле получить указатель на таблицу переходов и использовать его длявызов основной программы:
#include <jumptbl.h>
MyAPI *pAPI = (MyAPI*)(0x1000000); // there should be a better way to do this
int main()
{
pAPI->init(0);
void *block = pAPI->getmem(0x30);
//...
}
Надеюсь, это поможет!