2013-02-27 40 views
4

我試圖找到我的原生Android庫的代碼在進程的地址空間中佔用的地址範圍。我正在閱讀和解析/proc/self/maps。圖書館有兩部分。一個是代碼,另一個是數據,我猜。我需要將他們分開。然而,它們之間的區別是,有點環境。在Android 2.3.3上測試。好的方法來識別/ proc/*/maps中的代碼段

代碼段的權限是r-xp,數據是rwxp - 兩者都是可執行的。基於可寫性的決定,我感到不自在 - 如果在同樣的Android版本中,只讀數據部分會怎麼樣?

另一個區別是映射部分相對於文件的偏移量 - 代碼段的偏移量爲0.再次,如果鏈接器的某些迭代將數據放在代碼之前會怎麼樣?

與GDB和Android的stack walker一樣,這些工具告訴我代碼地址屬於哪個模塊,它在庫中的偏移量沒有問題。只是在說'。

編輯:在Android 4.0上,部分是不同的:有r-xp,r-p,rw-p。因此,我可以輕鬆識別可執行部分的故障診斷 - 但早期的Android會怎麼樣?

+0

我的代碼和數據都沒有可執行標誌。 – auselen 2013-02-28 14:45:43

+0

可能不同的Android版本... – 2013-02-28 16:07:07

+0

我認爲檢查'x'標誌是公平的。 – auselen 2013-03-01 12:03:37

回答

0

找到解決辦法。幸運的是,這些庫是my庫,所以我可以通過函數返回自己的地址來獲取代碼塊中的地址。然後我將它與部分邊界相匹配。

void *TestAddress() 
{ 
    return TestAddress; //That's within the code block, that's for sure. 
} 

這不會對第三方庫工作,因爲導入函數的函數地址將對應的import thunk,而不是真正的函數體。

相關問題