動的ライブラリを特定のメモリ アドレスに強制的にロードしたいと考えています。これを達成するために私は何をすべきですか?動的リンカーを変更しますか? 静的リンカに指示を出してください。多分リンカースクリプト?
私は 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 プログラムの一部にする
最後に、を C プログラムに静的にリンクすることを試みたlibc.a
ので、共有ライブラリとしてまったくロードされませんが、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)