Linux   发布时间:2022-04-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何在Linux中重新定义malloc()以用于C new大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我为我定义了mem_malloc()和mem_free(),我想用它们来替换malloc()和free(),从而替换C的new和delete. 我将它们定义如下: extern "C" { extern void *R_447_11845@em_malloc(size_t); extern void mem_free(void *); void * malloc(size_t sizE) { return me
@H_404_4@
我为我定义了mem_malloc()和mem_free(),我想用它们来替换malloc()和free(),从而替换C的new和delete.

我将它们定义如下:

extern "C" {

extern void *R_447_11845@em_malloc(size_t);
extern void mem_free(void *);

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

void
free(void *R_447_11845@emory) {
  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()和朋友?我希望这可以内置,但它们是未定义的.

@H_404_4@

解决方法

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

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

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

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

@H_404_4@ @H_404_4@
@H_404_4@
@H_404_4@

大佬总结

以上是大佬教程为你收集整理的如何在Linux中重新定义malloc()以用于C new全部内容,希望文章能够帮你解决如何在Linux中重新定义malloc()以用于C new所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。