11

我正在开发一个基于 arm9 处理器的项目。我们只使用没有任何操作系统的裸机,所以很遗憾我们还不支持共享库/动态加载器。

我希望能够从 SD 卡加载库,它也可以从主应用程序调用函数。

我的第一次尝试是使用链接器覆盖功能(将库放置在特定的绝对定位部分中),但是正如我之前提到的那样,调用主应用程序函数存在问题->每次更改主应用程序时都必须重新编译库能够回调。

根据这一点,我将不得不编写自己的动态加载器,但我是这方面的新手。请有人给我任何例子如何处理它或如何开始这样的项目?我们使用 gcc 作为 arm-elf 目标。

问候简

4

1 回答 1

7

检查此应用说明。它详细描述了动态链接的工作原理以及编写自己的动态加载器需要做什么。它还提供了一些替代方案。我认为跳转表很容易实现,并且可以解决您更改 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-04-11T14:37:23.110 回答