我想强制将动态库加载到特定的内存地址。我应该怎么做才能做到这一点?修改动态链接器?给静态链接器任何指示?也许是链接描述文件?
我正在使用 Android,当我启动一个 Android 应用程序时,Bionic C 库被加载到:
b6d2e000-b6da0000 r-xp 00000000 103:09 139 /system/lib/libc.so
b6da0000-b6da4000 r--p 00071000 103:09 139 /system/lib/libc.so
b6da4000-b6da7000 rw-p 00075000 103:09 139 /system/lib/libc.so
b6da7000-b6db1000 rw-p 00000000 00:00 0
我想要的是给动态链接器/静态链接器(或其他)一些提示,所以当我启动另一个应用程序(实际上是一个纯 C 程序)时,libc.so
将在相同的区域再次加载。如果 ASLR 有问题,我们可以假设它已被禁用。
目前,我的 C 程序libc
与 Android 应用程序的映射不同:
b6f04000-b6f76000 r-xp 00000000 103:09 139 /system/lib/libc.so
b6f76000-b6f7a000 r--p 00071000 103:09 139 /system/lib/libc.so
b6f7a000-b6f7d000 rw-p 00075000 103:09 139 /system/lib/libc.so
b6f7d000-b6f87000 rw-p 00000000 00:00 0
注意:两次运行都在同一次重新启动时,禁用了 ASLR!我猜它们在不同的领域,因为 Android 应用程序链接的共享库比纯 C 程序更多。
我想要的是?
- 理想情况下,我希望
libc
在纯 C 程序中映射到与 Android 程序相同的地址 - 至少,一种放置
libc
我觉得方便的地方(例如,可能在 VMA 空间的下部) - 通过静态链接使 libc 成为我的 C 程序的一部分
我已经尝试了最后一件事,将其静态链接libc.a
到我的 C 程序,因此它根本不会作为共享库加载,但android linker
在运行时失败:
Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tid 11726 (aCprogram)
backtrace:
#00 pc 000057aa /system/bin/aCprogram (getauxval+5)
#01 pc 0001a593 /system/lib/libc.so (__libc_init_common(KernelArgumentBlock&)+62)
#02 pc 000166a5 /system/lib/libc.so (__libc_preinit()+12)
#03 pc 00002465 /system/bin/linker (__dl__ZN6soinfo13call_functionEPKcPFvvE+48)
#04 pc 0000252f /system/bin/linker (__dl__ZN6soinfo10call_arrayEPKcPPFvvEjb+134)
#05 pc 000026f5 /system/bin/linker (__dl__ZN6soinfo17call_constructorsEv+160)
#06 pc 000026a9 /system/bin/linker (__dl__ZN6soinfo17call_constructorsEv+84)
#07 pc 000026a9 /system/bin/linker (__dl__ZN6soinfo17call_constructorsEv+84)
#08 pc 000026a9 /system/bin/linker (__dl__ZN6soinfo17call_constructorsEv+84)
#09 pc 000065d7 /system/bin/linker (__dl___linker_init+1278)
#10 pc 00001658 /system/bin/linker (_start+4)