我将它们定义如下:
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()和朋友?我希望这可以内置,但它们是未定义的.
解决方法
可能发生的是,main.cpp中的一些引用需要来自glibc的对象.具体来说,有些东西是动态加载库(dlopen).这段代码包含在glibc中(回答问题2).
当链接器包含来自glibc的对象并发现这些对象需要malloc / free符号时,它将尝试直接包含glocc库中的malloc / free.
由于您的-static链接器标志,整个libmemnmf-0.a库被静态包含在您的可执行文件中.这显然会在您的可执行文件中包含另一个malloc和free对象.
你应该做的是将malloc和free例程放在一个单独的.o文件中,并在link-command中的某处添加该文件,最好是在最后(假设你没有在该行上以特殊方式指定标准库). .o文件将满足所有符号请求,并且glibc库将在dlopen或其他对象需要时解析这些匹配.
区别在于libmnef-0.a文件是一个库,并且链接器与库的处理方式不同于简单对象(这与通过库来解析该库中对象所请求的符号的次数有关).
或者,您可以删除-static标志,我希望也可以解决此问题,但您可能有充分的理由将该标志包含在内.
如果要覆盖new和delete的行为,还可以查看重载operator new和operator delete for classes,以提供特定于类的分配方法或内存池.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。