检查此应用说明。它详细描述了动态链接的工作原理以及编写自己的动态加载器需要做什么。它还提供了一些替代方案。我认为跳转表很容易实现,并且可以解决您更改 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);
//...
}
希望这可以帮助!