最近,我的公司希望从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)
好的,这是合理的,因为libc.a
已经有了malloc()/free()
。
但是让我困惑的是为什么动态链接时没有错误。我搜索了一下,发现了这个问题:如何在Linux中重新定义malloc()以供C++ new使用。答案说链接器对库文件(.a)和目标文件(.o)进行不同的处理。现在我知道了为什么静态链接会出现错误而动态链接不会。
然而,我尝试了那个答案中描述的解决方案,直接用目标文件替换了库文件,但是没有任何区别。我仍然得到了多重定义链接错误。我还尝试了-static-libgcc
(因为我不知道该怎么做,所以我尝试了我在gcc
手册中看到的所有东西),但也没有帮助。
我不必使用静态链接。我只想解决libstdc++.so
的版本问题。任何建议都将不胜感激。
提前致谢。
编辑:很抱歉我没有表达清楚。在这里使用#define malloc ...
可能没有帮助。因为我们的程序是C++。这个#define
习惯用法只能影响malloc()/free()
函数。但我们的程序实际上使用new/delete
来分配/释放内存。不管怎样,还是谢谢:D
libstdc++.a
并动态链接libc.so
。 - Basile Starynkevitch