检查this application note。它详细描述了动态链接是如何工作的以及如何编写自己的动态加载器。它也提供了一些替代方案。我认为跳转表很容易实现,并将通过更改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);
//...
}
希望这有助于!
通常情况下,如果一个“库”调用回“程序”,它通过调用一个函数指针,该指针已经在前一次调用库中传递。这样图书馆就不依赖于程序的修改。至于使程序依赖于库的精确构建“少”,跳转表将会很简单。 – 2011-05-01 04:55:15