假設我有一個沒有外部依賴關係的C文件,並且只有const數據部分。我想編譯這個文件,然後得到一個二進制blob,我可以在另一個程序中加載,其中函數將通過函數指針使用。將目標文件轉換爲二進制代碼
讓我們舉個例子,這裏是一個fictionnal二進制模塊,在f1.c
static const unsigned char mylut[256] = {
[0 ... 127] = 0,
[128 ... 255] = 1,
};
void f1(unsigned char * src, unsigned char * dst, int len)
{
while(len) {
*dst++ = mylut[*src++];
len--;
}
}
我想編譯它f1.o,然後f1.bin,並使用它像這樣 中前衛.c
int somefunc() {
unsigned char * codedata;
f1_type_ptr f1_ptr;
/* open f1.bin, and read it into codedata */
/* set function pointer to beginning of loaded data */
f1_ptr =(f1_type_ptr)codedata;
/* call !*/
f1_ptr(src, dst, len);
}
我想從f1.c到f1.o涉及-fPIC來獲得位置獨立性。我可以使用 從f1.o到f1.bin使用哪些標誌或鏈接器腳本?
澄清:
我知道動態鏈接。動態鏈接在這種情況下是不可能的。如果可能的話,鏈接步驟必須是cast func指向加載數據的指針。
請假定沒有OS支持。如果可以的話,我會舉例如 在與PC相關的地址的彙編中寫入f1。
你知不知道,你可以使用共享對象的文件?您將.c文件編譯爲.so文件,然後將'dlopen()'加載到您的程序中,並將函數指針dlsym()傳遞給函數。然後你可以打電話給它。 –
讓我們忘記libc和動態鏈接 – shodanex
你想動態地(即在運行時)加載'f1.bin'嗎?然後你必須建立一個共享庫,並使用ldopen()+ ldsym()或其他模塊加載器(如gmodule)。由於潛在的安全威脅(執行數據段等),嘗試以其他方式執行此操作可能會很困難並被拒絕。 –