我希望共享库始终加载在 Android 4.0.3 上的相同地址。
我似乎无法使用以下方法禁用 ASLR:
echo 0 > /proc/sys/kernel/randomize_va_space
跑步
cat /proc/sys/kernel/randomize_va_space
确实显示 0,但在启动应用程序后,共享库总是(仍然)加载到不同的地址。
编辑:
启动使用命令加载共享对象的活动时会看到上述行为
am start -n <activity>
OTOH,当尝试使用用 C 编写的小型本机进程时,当 ASLR 被禁用时,相同的共享库会被加载到相同的地址
echo 0 > /proc/sys/kernel/randomize_va_space
或者
sysctl -w kernel.randomize_va_space=0
我已经使用 android-ndk-r7c 工具链 arm-linux-androideabi-4.4.3 编译了应用程序,没有任何特殊的编译器开关(例如 -fPIE 或 -pie)。
我也尝试过类似这里描述的东西,但共享库仍然在不同的地址加载 - 我猜不能在 Android 上禁用每个进程的 ASLR。
由于缺少 SYS_personality,我没有设法从 util-linux 交叉编译 setarch.c。
编辑2:
进一步的调查取得了部分成功。这就是我所做的,结果是通过“am start -n”启动的应用程序主要在两个不同的地址上加载共享库:
- 使用其中一种方法将 ASLR 设置为禁用状态,
- 杀死“/system/bin/servicemanager”进程(kill -9 PID)——这也应该关闭zygote并完成UI,
- 等待 servicemanager、zygote 和 UI 重新启动 - init.rc 处理这个,
- 尝试启动/终止/启动我的应用程序
在 20 多个启动和终止序列之后,我的应用程序总是在一个或另一个内存地址上加载共享库。怎么来的?不知道!
尽管如此,这应该对调试共享库有很大帮助,因为共享库通常连续多次加载到一个地址上,然后在接下来的几次加载到另一个地址,并访问第一个地址。