【问题标题】:Good way to identify the code section in /proc/*/maps识别 /proc/*/maps 中代码部分的好方法
【发布时间】:2023-03-16 08:45:01
【问题描述】:

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

【问题讨论】:

  • 我的代码和数据都没有可执行标志。
  • Android 版本可能不同...
  • 我认为检查“x”标志是公平的。
  • 不兼容 Android 2.3.3。

标签: android linux android-ndk


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 2020-01-25
    相关资源
    最近更新 更多