2011-04-11 24 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

相關問題