识别/ proc / * / maps中的代码部分的好方法

时间:2013-02-27 20:41:44

标签: android linux android-ndk

我正在尝试查找我的原生Android库的代码在进程的地址空间中占用的地址范围。我正在阅读并解析/proc/self/maps。该库有两个部分。一个是代码,另一个是数据,我猜。我需要区分它们。然而,他们之间的区别是,有点间接。在Android 2.3.3上进行测试。

代码部分的权限是r-xp,数据是rwxp - 两者都是可执行的。基于可写性的决定让我感到不安 - 如果在相同版本的Android上有一个只读数据部分会怎样?

另一个区别是映射部分相对于文件的偏移量 - 代码部分偏移量为0.再次,如果链接器的某些迭代在代码之前放置数据会怎么样?

这些工具,比如GDB和Android的堆栈walker,可以告诉我代码地址属于哪个模块,以及它在库中的偏移量是什么。只是说'。

编辑:在Android 4.0上,各个部分不同:有r-xp,r - p,rw-p。这样我就可以轻松地识别可执行部分失败了 - 但是早期的Androids呢?

1 个答案:

答案 0 :(得分:0)

找到了解决方法。幸运的是,这些是我的库,所以我可以通过拥有一个返回自己地址的函数来获得代码块中肯定的地址。然后我将它与部分边界匹配。

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

这对第三方库不起作用,因为导入函数的函数地址对应于导入thunk,而不是真实函数的主体。