檢查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);
//...
}
希望這有助於!
通常情況下,如果一個「庫」調用回「程序」,它通過調用一個函數指針,該指針已經在前一次調用庫中傳遞。這樣圖書館就不依賴於程序的修改。至於使程序依賴於庫的精確構建「少」,跳轉表將會很簡單。 – 2011-05-01 04:55:15