В последнее время моя компания хочет обновить компилятор с gcc-3.4 до gcc-4.5.Однако машина нашего клиента может не иметь обновленной libstdc++.so
, поэтому мы хотим статически связать наш двоичный файл.
Нашей программе необходимо настроить malloc()/free()
для очень высокой производительности.
Я изменил make-файл, добавил -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()
.
Но что меня смущает, так это то, что при динамическом линковании нет ошибок.Я искал и нашел этот вопрос: Как переопределить malloc () в Linux для использования в C ++ new .В ответе говорится, что компоновщик по-разному относится к файлу библиотеки (.a) и объектному файлу (.o).Теперь я знаю причину, по которой ошибка возникает при статическом связывании, а не при динамическом.
Однако я попробовал решение, описанное в этом ответе, заменил библиотечный файл на объектный файл напрямую, но разницы нет.Я все еще получил ошибку связывания множественного определения.Я также попробовал -static-libgcc
(потому что я не знаю, что делать, я просто попробовал все, что видел на gcc
man-странице), но это тоже не помогает.
Мне не нужно использоватьстатическое связывание.Я просто хочу решить проблему с версией libstdc++.so
.Будем благодарны за любые предложения.
Заранее спасибо.
edit: Извините, я не прояснил себя.Использование #define malloc ...
может не помочь здесь.Так как наша программа на C ++.Идиома #define
может воздействовать только на функцию malloc()/free()
.Но наша программа активно использует new/delete
для выделения / освобождения памяти.Все равно спасибо: D