在Android上强制动态库位于固定地址

在Android上强制动态库位于固定地址,android,c,linker,dynamic-linking,android-runtime,Android,C,Linker,Dynamic Linking,Android Runtime,我想强制在特定内存地址加载动态库。 为了实现这一点,我应该做些什么?修改动态链接器?是否向静态链接器提供任何说明?可能是链接器脚本 我正在使用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.

我想强制在特定内存地址加载动态库。 为了实现这一点,我应该做些什么?修改动态链接器?是否向静态链接器提供任何说明?可能是链接器脚本

我正在使用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程序链接更多的共享LIB

我想要什么?

  • 理想情况下,我希望纯C程序中的
    libc
    与Android程序位于同一地址
  • 至少,在我觉得方便的地方放置
    libc
    (例如,可能在VMA空间的较低部分)
  • 通过静态链接使libc成为我的C程序的一部分
  • 我已经尝试了最后一件事,将
    libc.a
    静态链接到我的C程序,因此它根本不会作为共享库加载,但是
    android链接器在运行时失败:

    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)
    

    你想达到什么目标?Android设备不会在真实模式下运行,是吗?不,不会,但虚拟映射对我来说仍然是个问题!问题将更新为解决我问题的所有方案!如果在那个位置已经加载了另一个系统库呢?Android上为纯C应用加载的系统库不多。是libc,libc++,netd,libm。我想通过回答@paulsm4的问题,它将帮助我们理解并帮助你们