我正在做一个基于arm9处理器的项目。我们只使用裸机,没有任何操作系统,所以不幸的是,我们还不支持共享库/动态加载器。
我希望能够有库加载,例如从SD卡,它也可以从主应用程序调用函数。
我的第一次尝试是使用链接器覆盖功能(将库放置在特定的绝对位置部分),但是这里有一个问题,调用主应用程序函数,正如我之前提到的->随着主应用程序的每次更改,库必须再次重新编译才能回调。
根据这个我想我将不得不写我自己的动态加载器,但我是这个领域的新手。请有人给我任何例子如何处理它或如何开始这样的项目?我们在arm-elf目标中使用gcc。
的问候1月
查看此应用说明。它详细描述了动态链接是如何工作的,以及编写自己的动态加载器需要做些什么。它也提供了一些替代方案。我认为跳转表是很容易实现的,并将解决您的问题与更改API地址。
Edit:下面是如何做一个简单的跳转表。首先,确定需要从主程序导出哪些函数。然后创建一个函数指针结构:
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);
//...
}
希望这对你有帮助!