如何在Android的ndk-gdb中调用malloc()

时间:2014-07-01 08:36:59

标签: android linker android-ndk

当我尝试在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

linkerlibc.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()
  • 的任何函数

所以,问题是:

为什么gdb会调用在malloc()而不是linker中实现的libc.so函数,

我该如何调用libc.so的{​​{1}},以及内部调用malloc()的函数

1 个答案:

答案 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是结果