gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 00:18:48 26 4
gpt4 key购买 nike

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

错误日志出现在日志 View 中:

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调用linker中实现的malloc()函数而不是libc.so,

以及如何调用libc.somalloc(),以及内部调用malloc()的函数

最佳答案

示例:

(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的原型(prototype)是:void *malloc(size_t size)

然后,投出指针

(gdb) x (void (*)(size_t))(0x7ffff7df07a0)(4)
0x603030: 0x00000000

0x6003030是结果

关于android - 如何在 Android 的 ndk-gdb 中调用 malloc(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24505821/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com