2010-07-21 42 views
2

我有所有的符號(與上libelf的自己的二進制。所以執行得)的偏移地址的。現在,在運行時,我需要計算所有這些符號的絕對地址,爲此我需要獲取基地址(共享庫的加載位置)並進行計算:如何共享庫獲得自己的基地址

symbol_address = base_address + symbol_offset

一個共享庫怎樣才能獲得自己的基地址?在Windows上,我會使用傳遞給DllMain的參數,在linux中有一些等價的東西嗎?

+0

你想要一個庫函數來計算同一個庫中的一個對象的地址嗎?你有沒有理由不能像指針賦值那樣將對象的地址? – 2010-07-21 13:47:52

+0

我需要迭代二進制文件中的所有符號,並獲取其絕對地址以進行一些進一步計算,因此手動訪問每個對象幾乎不可能用於較大的二進制文件(更不用說來自crt的符號)。所以現在我可以用libelf獲得所有符號的偏移量,只需要這個基地址就可以計算虛擬地址。 – 2010-07-23 07:52:14

回答

4

在Linux上,dladdr()libfoo.so任何符號會給你

void *dli_fbase;  /* Load address of that object */ 

更多信息here

或者,dl_iterate_phdrcan give加載加載到當前過程中的每個ELF圖像的地址。

兩者都是GLIBC擴展。如果你不使用GLIBC,不要告訴你使用的是什麼,所以更加合適的回答可以給。

+0

謝謝,與dladdr() – 2010-07-30 10:33:17

-1

經過一番研究,我設法找出其描述符,它會受到dlopen()函數返回遊覽庫加載的地址的方法。它是在這樣的宏的幫助下執行的:

#define LIBRARY_ADDRESS_BY_HANDLE(dlhandle) ((NULL == dlhandle) ? NULL : (void*)*(size_t const*)(dlhandle)) 
+0

一起工作此答案對於預鏈接庫不起作用。此外,它最好表達爲「((struct link_map *)dlhandle) - > l_addr」 – 2010-12-28 05:17:50