4

我正在尝试查找我的原生 Android 库代码在进程地址空间中占用的地址范围。我正在阅读和解析/proc/self/maps。图书馆有两个部分。一个是代码,另一个是数据,我猜。我需要把它们区分开来。但是,它们之间的差异是间接的。在 Android 2.3.3 上测试。

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

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

这些工具,如 GDB 和 Android 的 stack walker,可以毫无问题地告诉我代码地址属于哪个模块,以及它在库中的偏移量是多少。只是在说'。

编辑:在 Android 4.0 上,这些部分是不同的:有 r-xp、r--p、rw-p。所以这让我很容易识别出可执行部分失败 - 但是早期的 Android 呢?

4

1 回答 1

0

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

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

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

于 2013-02-28T16:23:34.560 回答