加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

如何在Linux中重新定义malloc()以用于C new

发布时间:2020-12-14 00:55:15 所属栏目:Linux 来源:网络整理
导读:我为我定义了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);}
我为我定义了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()和朋友?我希望这可以内置,但它们是未定义的.

解决方法

我假设您在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库被静态包含在您的可执行文件中.这显然会在您的可执行文件中包含另一个malloc和free对象.

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读