共享库-如何为裸机臂应用程序编写动态加载器



我正在做一个基于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);
  //...
}

希望这对你有帮助!

相关内容

  • 没有找到相关文章

最新更新