2011-04-11 50 views
8

我正在开发基于arm9处理器的项目。我们只使用没有任何操作系统的裸机,所以很遗憾我们还没有支持共享库/动态装载器。如何编写用于裸机手臂应用的动态加载程序

我希望能够从SD卡加载例如,也可以调用主应用程序的功能库。

我的第一个尝试是使用链接器覆盖功能(将库放置在特定的绝对定位节中),但这是调用主应用程序函数的问题,正如我之前提到的 - >每次更改主应用程序库再次重新编译以便能够回调。

根据这个我的事情我将不得不写我自己的动态加载程序,但我在这方面是新手。可以请某人给我任何例子如何处理它或如何开始这样的项目?我们使用gcc作为arm-elf目标。

认为 月

+0

通常情况下,如果一个“库”调用回“程序”,它通过调用一个函数指针,该指针已经在前一次调用库中传递。这样图书馆就不依赖于程序的修改。至于使程序依赖于库的精确构建“少”,跳转表将会很简单。 – 2011-05-01 04:55:15

回答

5

检查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); 
    //... 
} 

希望这有助于!

+0

谢谢你的回答。你知道arm编译器工具链与GCC有什么不同吗?该appnote建议使用symdefs文件来创建跳转表,但不幸的是我不知道gcc中的symdefs替代方案... – Honza 2011-04-12 07:48:56

+0

我不确定什么是symdefs,但我已经在跳转表中添加了一个小小的howto,希望这很清楚。 – 2011-04-12 11:50:54

+0

感谢您提供有关jumtables的信息。这是一个完美的例子,就像我需要的一样。 – Honza 2011-04-14 06:33:25

相关问题