大佬教程收集整理的这篇文章主要介绍了如何在Linux中重新定义malloc()以用于C new,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我将它们定义如下:
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中的一些引用需要来自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@以上是大佬教程为你收集整理的如何在Linux中重新定义malloc()以用于C new全部内容,希望文章能够帮你解决如何在Linux中重新定义malloc()以用于C new所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。