2013-02-27 124 views
4

我试图找到我的原生Android库的代码在进程的地址空间中占用的地址范围。我正在阅读和解析/proc/self/maps。图书馆有两部分。一个是代码,另一个是数据,我猜。我需要将他们分开。然而,它们之间的区别是,有点环境。在Android 2.3.3上测试。好的方法来识别/ proc/*/maps中的代码段

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

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

与GDB和Android的stack walker一样,这些工具告诉我代码地址属于哪个模块,它在库中的偏移量没有问题。只是在说'。

编辑:在Android 4.0上,部分是不同的:有r-xp,r-p,rw-p。因此,我可以轻松识别可执行部分的故障诊断 - 但早期的Android会怎么样?

+0

我的代码和数据都没有可执行标志。 – auselen 2013-02-28 14:45:43

+0

可能不同的Android版本... – 2013-02-28 16:07:07

+0

我认为检查'x'标志是公平的。 – auselen 2013-03-01 12:03:37

回答

0

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

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

这不会对第三方库工作,因为导入函数的函数地址将对应的import thunk,而不是真正的函数体。