当我尝试在ndk-gdb
中调用malloc()函数时(gdb) call malloc(4)
gdb报告失败
Program received signal SIGSEGV, Segmentation fault.
0x4017a8f4 in ?? () from /Users/chyhfj/Desktop/hello-jni/obj/local/armeabi/linker
日志视图中出现错误日志:
F/linker (32355): ERROR: malloc called from the dynamic linker!
我做了一些研究,研究android仿生链接器source code,发现它实现了malloc()函数,以避免在链接器中调用malloc()。
// You shouldn't try to call memory-allocating functions in the dynamic linker.
// Guard against the most obvious ones.
#define DISALLOW_ALLOCATION(return_type, name, ...) \
return_type name __VA_ARGS__ \
{ \
const char* msg = "ERROR: " #name " called from the dynamic linker!\n"; \
__libc_format_log(ANDROID_LOG_FATAL, "linker", "%s", msg); \
write(2, msg, strlen(msg)); \
abort(); \
}
DISALLOW_ALLOCATION(void*, malloc, (size_t u __unused));
DISALLOW_ALLOCATION(void, free, (void* u __unused));
DISALLOW_ALLOCATION(void*, realloc, (void* u1 __unused, size_t u2 __unused));
DISALLOW_ALLOCATION(void*, calloc, (size_t u1 __unused, size_t u2 __unused));
我检查加载的共享库:
(gdb) info shared library
From To Syms Read Shared Object Library
0x40175a40 0x40180da8 Yes (*) /Users/chyhfj/Desktop/hello-jni/obj/local/armeabi/linker
0x400feac0 0x4012e36c Yes (*) /Users/chyhfj/Desktop/hello-jni/obj/local/armeabi/libc.so
linker
和libc.so
都已加载。
更新:由于Richard MA引用了一些gdb命令,这里有一些更多的信息
(gdb) info functions malloc
0x40177664 malloc
0x400ffb58 malloc
(gdb) info symbol malloc
malloc in section .text of /Users/chyhfj/Desktop/hello-jni/obj/local/armeabi/linker
(gdb) info symbol 0x40177664
malloc in section .text of /Users/chyhfj/Desktop/hello-jni/obj/local/armeabi/linker
(gdb) info symbol 0x400ffb58
malloc in section .text of /Users/chyhfj/Desktop/hello-jni/obj/local/armeabi/libc.so
我想要做的事情:
所以,问题是:
为什么gdb会调用在malloc()
而不是linker
中实现的libc.so
函数,
我该如何调用libc.so
的{{1}},以及内部调用malloc()
的函数
答案 0 :(得分:2)
(gdb) info symbol malloc
malloc in section .text of /lib64/ld-linux-x86-64.so.2
(gdb) info addr malloc
Symbol "malloc" is at 0x7ffff7df07a0 in a file compiled without debugging.
malloc的原型是:void *malloc(size_t size)
然后,施放指针
(gdb) x (void (*)(size_t))(0x7ffff7df07a0)(4)
0x603030: 0x00000000
0x6003030
是结果