android - 识别/proc/*/maps 中的代码段的好方法

标签 android linux android-ndk

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

最佳答案

找到解决方法。幸运的是,这些是我的 库,因此我可以通过具有返回其自身地址的函数来获得代码块中肯定存在的地址。然后我将它与部分边界进行匹配。

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

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

关于android - 识别/proc/*/maps 中的代码段的好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15121970/

相关文章:

android - 如何制作动态选项菜单?

javascript - NodeJs 套接字连接问题

c - 在 C 的 UDP 中用 recvfrom 生成的缓冲区中有什么?

linux - 在 Linux 中将隐藏文件转换为普通文件

linux - 如何在 Fedora 中安装 NDK?

Android NDK Linking shared library unsatisfied Linker Error

java - Firebase RecyclerView 显示一项

android - 如何在android中的可扩展 ListView 中的子点击部分触发事件

android - fragment 有时会在返回堆栈时保存变量

android - 具有过渡效果的图像到视频转换