Обновлен до Debian 7.5; теперь ‘memcpy@GLIBC_2.14 ‘ не определено

#c #gcc #debian #glibc

#c #gcc #debian #glibc

Вопрос:

Неделю назад я мог без проблем скомпилировать и связать свой проект (C ). Однако, выполнив sudo apt-get dist-upgrade ранее на этой неделе, я больше не могу связать свою программу.

Ошибка, которую я получаю, выглядит так:

 Compiling CEF Client
scons: Reading SConscript files ...
Compiling cef_client
Build type: release-with-debug
scons: done reading SConscript files.
scons: Building targets ...
Compiling ==> 'AttributeBinding.cpp'
Compiling ==> 'ClientApp.cpp'
Compiling ==> 'DuplicateAttributeException.cpp'
Compiling ==> 'DuplicateFunctionException.cpp'
Compiling ==> 'FunctionBinding.cpp'
Compiling ==> 'Main.cpp'
Compiling ==> 'ObjectBinding.cpp'
Compiling ==> 'Logger.cpp'
Linking program ==> 'cef3_client'
/home/jarrett/projects/icebreakers/glr/deps/boost/lib/libboost_log.so: undefined reference to `memcpy@GLIBC_2.14'
collect2: error: ld returned 1 exit status
scons: *** [build/cef3_client] Error 1
scons: building terminated because of errors.
  

Дело в том, что я создал библиотеку журналов boost на этой же машине, и она работала нормально, пока я не сделал dist-upgrade .

До этого у меня было несколько других проблем с включаемыми файлами, и я исправил это, переустановив gcc-4.7 и gcc-4.7-base . Я libc также попытался переустановить с помощью: sudo aptitude reinstall libc6 libc6-dbg libc6-dev , но это ничего не исправило.

Я также попытался переустановить множество пакетов, которые имели glib в названии:

 sudo aptitude reinstall gir1.2-glib-2.0 gir1.2-telepathyglib-0.12 gir1.2-upowerglib-1.0 glib-networking glib-networking-common glib-networking-services libavahi-glib1 libcglib-java libdbus-glib-1-2 libdbus-glib-1-dev libdbus-glib1.0-cil libgeocode-glib0 libghc-glib-dev libglib-perl libglib2.0-0 libglib2.0-bin libglib2.0-cil libglib2.0-cil-dev libglib2.0-data libglib2.0-dev libglibmm-2.4-1c2a libglibmm-2.4-dev libjson-glib-1.0-0 libnm-glib-vpn1 libnm-glib4 libpackagekit-glib2-14 libpoppler-glib8 libpulse-mainloop-glib0 libsofia-sip-ua-glib3 libtelepathy-glib0 libupower-glib1
  

Я также попытался переустановить build-essentials , gcc , и g , безрезультатно.

У кого-нибудь есть идеи, что здесь происходит?

Ответ №1:

Вам необходимо перекомпилировать библиотеку журналов Boost для обновленного glibc. Файл .so, который у вас есть сейчас, был скомпилирован для предыдущей версии.

Комментарии:

1. Я этого боялся. Я попытался экспортировать символы из my libc.so , и я нашел memcpy@@GLIBC_2.2.5 . Мне любопытно — разве эти двоичные файлы не должны быть обратно совместимы? Как, не нарушая совместимость с ABI?

2. Их API обычно будет обратно совместим (за вычетом потенциально устаревших функций), но компоновщик ищет конкретную версию файла .so. Если вы выполните ldd для двоичного файла, вы увидите, что таблица символов специально ищет определенную версию.

3. Хм .. Я думаю, возможно, мой debian понизил рейтинг библиотеки glibc с 2.14 до 2.13 — это единственное, что я могу придумать, что может привести к разрыву ABI. Ну что ж, я думаю, мне просто придется перекомпилировать 🙂 Спасибо @CDahn