我有所有的符號(與上libelf的自己的二進制。所以執行得)的偏移地址的。現在,在運行時,我需要計算所有這些符號的絕對地址,爲此我需要獲取基地址(共享庫的加載位置)並進行計算:如何共享庫獲得自己的基地址
symbol_address = base_address + symbol_offset
一個共享庫怎樣才能獲得自己的基地址?在Windows上,我會使用傳遞給DllMain的參數,在linux中有一些等價的東西嗎?
我有所有的符號(與上libelf的自己的二進制。所以執行得)的偏移地址的。現在,在運行時,我需要計算所有這些符號的絕對地址,爲此我需要獲取基地址(共享庫的加載位置)並進行計算:如何共享庫獲得自己的基地址
symbol_address = base_address + symbol_offset
一個共享庫怎樣才能獲得自己的基地址?在Windows上,我會使用傳遞給DllMain的參數,在linux中有一些等價的東西嗎?
經過一番研究,我設法找出其描述符,它會受到dlopen()函數返回遊覽庫加載的地址的方法。它是在這樣的宏的幫助下執行的:
#define LIBRARY_ADDRESS_BY_HANDLE(dlhandle) ((NULL == dlhandle) ? NULL : (void*)*(size_t const*)(dlhandle))
一起工作此答案對於預鏈接庫不起作用。此外,它最好表達爲「((struct link_map *)dlhandle) - > l_addr」 – 2010-12-28 05:17:50
你想要一個庫函數來計算同一個庫中的一個對象的地址嗎?你有沒有理由不能像指針賦值那樣將對象的地址? – 2010-07-21 13:47:52
我需要迭代二進制文件中的所有符號,並獲取其絕對地址以進行一些進一步計算,因此手動訪問每個對象幾乎不可能用於較大的二進制文件(更不用說來自crt的符號)。所以現在我可以用libelf獲得所有符號的偏移量,只需要這個基地址就可以計算虛擬地址。 – 2010-07-23 07:52:14