使用静态链接重新定义malloc/free具有多个定义错误

yoc*_*oco 7 c c++ malloc gcc static-linking

最近,我的公司想要将编译器从gcc-3.4更新到gcc-4.5.但是,我们客户的机器可能没有最新版本libstdc++.so,因此我们希望静态链接我们的二进制文件.

我们的计划需要根据malloc()/free()非常高的性能要求定制.

我修改了makefile,添加了一段-static时间链接,并收到以下错误消息:

/usr/lib64/libc.a(malloc.o)(.text+0x18c0): In function `free':
: multiple definition of `free'
../../ic/src/memmgr/libmemmgr_mt_thread.a(memmgr_mt_thread.o)(.text+0x3430): first defined here
/usr/bin/ld: Warning: size of symbol `free' changed from 271 in ../../ic/src/memmgr/libmemmgr_mt_thread.a(memmgr_mt_thread.o) to 255 in /usr/lib64/libc.a(malloc.o)
/usr/lib64/libc.a(malloc.o)(.text+0x3970): In function `malloc':
: multiple definition of `malloc'
../../ic/src/memmgr/libmemmgr_mt_thread.a(memmgr_mt_thread.o)(.text+0x29c0): first defined here
/usr/bin/ld: Warning: size of symbol `malloc' changed from 281 in ../../ic/src/memmgr/libmemmgr_mt_thread.a(memmgr_mt_thread.o) to 461 in /usr/lib64/libc.a(malloc.o)
/usr/lib64/libc.a(malloc.o)(.text+0x4050): In function `realloc':
: multiple definition of `realloc'
../../ic/src/memmgr/libmemmgr_mt_thread.a(memmgr_mt_thread.o)(.text+0x3e80): first defined here
/usr/bin/ld: Warning: size of symbol `realloc' changed from 335 in ../../ic/src/memmgr/libmemmgr_mt_thread.a(memmgr_mt_thread.o) to 927 in /usr/lib64/libc.a(malloc.o)
Run Code Online (Sandbox Code Playgroud)

好吧,这是合理的,因为libc.a已经有了malloc()/free().

但令我困惑的是动态链接时没有错误的原因.我搜索过,发现了这个问题:如何在Linux中重新定义malloc()以用于C++ new.答案是链接器以不同方式处理库文件(.a)和目标文件(.o).现在我知道静态链接发生错误但动态错误发生的原因.

但是,我尝试了该答案中描述的解决方案,直接用目标文件替换库文件,但没有区别.我仍然有多个定义链接错误.我也尝试过-static-libgcc(因为我不知道该怎么做,我只是尝试了我在gcc手册页中看到的所有内容),但它也没有帮助.

我不必使用静态链接.我只是想解决libstdc++.so版本问题.任何建议将不胜感激.

提前致谢.

编辑:对不起,我没有说清楚.使用#define malloc ...可能没有帮助.因为我们的程序是C++.这个#define成语只能影响这个malloc()/free()功能.但我们的程序实际上用于new/delete分配/释放内存.无论如何,谢谢:D

baz*_*i77 5

如果您主要关心的是libstdc ++的可用性,那么在目标系统中,为什么不简单地将更新版本的应用程序与您的应用程序一起分发?

我认为静态链接在任何情况下都不是一个好的解决方案,编译项目会变得更加困难,如果你自己使用共享对象(例如使用自己的插件时),那么静态链接就会停​​止工作,因为单独的静态库的副本需要链接到每个二进制文件,可执行文件等.你能想象如果在加载时同一程序中有多个全局变量,锁等实例会发生什么?我会告诉你:崩溃.

所以不要静态链接,复制libstdc ++.所以到私有目录(我不知道你的应用程序安装在哪里,但如果它有一个私有前缀,那很简单,使用$ prefix/lib).

然后设置LD_LIBRARY_PATH,或使用-rpath将路径编码为二进制文件,以便链接器找到它.当然,这意味着您链接的所有库,也可能使用libstdc ++,也应该与您的应用程序一起分发.

但是在大小方面,它大致相同,使用静态链接也会带有代码.