gpt4 book ai didi

c++ - 如何在 Linux 中重新定义 malloc() 以便在 C++ 中使用 new

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:32:24 26 4
gpt4 key购买 nike

我有一个为我定义的 mem_malloc() 和 mem_free(),我想用它们来替换 malloc() 和 free(),从而替换 C++ 的 new 和 delete。

我定义它们如下:

extern "C" {

extern void *mem_malloc(size_t);
extern void mem_free(void *);

void *
malloc(size_t size) {
return mem_malloc(size);
}

void
free(void *memory) {
mem_free(memory);
}
}

但是,我收到两个链接错误:

[user@machine test]$ g++ -m32 -pthread main.cpp -static  libmemnmf-O.a
/usr/lib/../lib/libc.a(malloc.o): In function `free':
(.text+0x153c): multiple definition of `free'
/tmp/ccD2Mgln.o:main.cpp:(.text+0x842): first defined here
/usr/lib/../lib/libc.a(malloc.o): In function `malloc':
(.text+0x3084): multiple definition of `malloc'
/tmp/ccD2Mgln.o:main.cpp:(.text+0x856): first defined here
libmemnmf-O.a(mem_debug.o): In function `mem_init_debug_routines':
mem_debug.c:(.text+0x83c): undefined reference to `dlopen'
mem_debug.c:(.text+0x89d): undefined reference to `dlsym'
mem_debug.c:(.text+0xa03): undefined reference to `dlclose'
mem_debug.c:(.text+0xa24): undefined reference to `dlclose'
mem_debug.c:(.text+0xa2e): undefined reference to `dlerror'
collect2: ld returned 1 exit status

1) 如何消除多重定义的 malloc() 和 free() 错误,并只采用我的定义而不是内置的?

2) 哪个库提供了 dlopen() 和 friend ?我希望这是内置的,但它们是未定义的。

最佳答案

我假设您在尝试编译的 main.cpp 文件中定义了 malloc 和 free,并且 mem_alloc 和 mem_free 位于 libmemnmf-0.a 中

可能发生的情况是,main.cpp 中的某些引用需要来自 glibc 的对象。具体来说,有些东西正在动态加载库(dlopen)。此代码包含在 glibc 中(回答问题 2)。当链接器包含来自 glibc 的对象并发现这些对象需要 malloc/free 符号时,它将尝试直接包含来自 glibc 库的 malloc/free。由于您的 -static 链接器标志,整个 libmemnmf-0.a 库静态包含在您的可执行文件中。这显然会在您的可执行文件中包含另一个 malloc 和自由对象。

你应该做的是将 malloc 和 free 例程放在一个单独的 .o 文件中,并将该文件添加到你的链接命令中的某个位置,最好是在末尾(假设你没有以特殊方式指定标准库线)。 .o 文件将满足所有符号请求,并且 glibc 库将在 dlopen 或其他对象需要它们时发现这些匹配已解决。不同之处在于 libmnef-0.a 文件是一个库,链接器处理库的方式与处理简单对象的方式不同(这与通过库以解析该库中对象请求的符号的次数有关)。或者,您可以删除 -static 标志,我希望它也能解决问题,但您可能有充分的理由在开始时包含该标志。

如果要覆盖 new 和 delete 的行为,还可以考虑为类重载 operator new 和 operator delete 以提供特定于类的分配方法或内存池。

关于c++ - 如何在 Linux 中重新定义 malloc() 以便在 C++ 中使用 new,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4364647/

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