我正在尝试查找我的原生 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 呢?