имя приложения: /lib/libc.so.6: версия `GLIBC_2.8 'не найдена (требуется для имени приложения) - PullRequest
1 голос
/ 27 июля 2010

ldd -v appname

linux-gate.so.1 =>  (0x00949000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00cea000)
libm.so.6 => /lib/libm.so.6 (0x00a83000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00ba1000)
libc.so.6 => /lib/libc.so.6 (0x0015c000)
/lib/ld-linux.so.2 (0x0012f000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00b93000)

Version information:
appname:
    libm.so.6 (GLIBC_2.0) => /lib/libm.so.6
    libc.so.6 (GLIBC_2.8) => not found
    libc.so.6 (GLIBC_2.2) => /lib/libc.so.6
    libc.so.6 (GLIBC_2.3.2) => /lib/libc.so.6
    libc.so.6 (GLIBC_2.7) => not found
    libc.so.6 (GLIBC_2.4) => /lib/libc.so.6
    libc.so.6 (GLIBC_PRIVATE) => /lib/libc.so.6
    libc.so.6 (GLIBC_2.1) => /lib/libc.so.6
    libc.so.6 (GLIBC_2.1.3) => /lib/libc.so.6
    libc.so.6 (GLIBC_2.2.4) => /lib/libc.so.6
    libc.so.6 (GLIBC_2.3) => /lib/libc.so.6
    libc.so.6 (GLIBC_2.0) => /lib/libc.so.6
    libstdc++.so.6 (CXXABI_1.3) => /usr/lib/libstdc++.so.6
    libstdc++.so.6 (GLIBCXX_3.4.5) => /usr/lib/libstdc++.so.6
    libstdc++.so.6 (GLIBCXX_3.4) => /usr/lib/libstdc++.so.6
    libpthread.so.0 (GLIBC_2.2) => /lib/libpthread.so.0
    libpthread.so.0 (GLIBC_2.1) => /lib/libpthread.so.0
    libpthread.so.0 (GLIBC_2.0) => /lib/libpthread.so.0
    libpthread.so.0 (GLIBC_2.3.2) => /lib/libpthread.so.0
/lib/libpthread.so.0:
    ld-linux.so.2 (GLIBC_2.3) => /lib/ld-linux.so.2
    ld-linux.so.2 (GLIBC_2.1) => /lib/ld-linux.so.2
    ld-linux.so.2 (GLIBC_PRIVATE) => /lib/ld-linux.so.2
    libc.so.6 (GLIBC_2.1.3) => /lib/libc.so.6
    libc.so.6 (GLIBC_2.1) => /lib/libc.so.6
    libc.so.6 (GLIBC_2.3.2) => /lib/libc.so.6
    libc.so.6 (GLIBC_2.2) => /lib/libc.so.6
    libc.so.6 (GLIBC_PRIVATE) => /lib/libc.so.6
    libc.so.6 (GLIBC_2.0) => /lib/libc.so.6
/lib/libm.so.6:
    ld-linux.so.2 (GLIBC_PRIVATE) => /lib/ld-linux.so.2
    libc.so.6 (GLIBC_2.1.3) => /lib/libc.so.6
    libc.so.6 (GLIBC_2.0) => /lib/libc.so.6
/usr/lib/libstdc++.so.6:
    ld-linux.so.2 (GLIBC_2.3) => /lib/ld-linux.so.2
    libgcc_s.so.1 (GCC_4.2.0) => /lib/libgcc_s.so.1
    libgcc_s.so.1 (GLIBC_2.0) => /lib/libgcc_s.so.1
    libgcc_s.so.1 (GCC_3.3) => /lib/libgcc_s.so.1
    libgcc_s.so.1 (GCC_3.0) => /lib/libgcc_s.so.1
    libc.so.6 (GLIBC_2.3.2) => /lib/libc.so.6
    libc.so.6 (GLIBC_2.4) => /lib/libc.so.6
    libc.so.6 (GLIBC_2.1) => /lib/libc.so.6
    libc.so.6 (GLIBC_2.3) => /lib/libc.so.6
    libc.so.6 (GLIBC_2.1.3) => /lib/libc.so.6
    libc.so.6 (GLIBC_2.0) => /lib/libc.so.6
    libc.so.6 (GLIBC_2.2) => /lib/libc.so.6
/lib/libc.so.6:
    ld-linux.so.2 (GLIBC_PRIVATE) => /lib/ld-linux.so.2
    ld-linux.so.2 (GLIBC_2.3) => /lib/ld-linux.so.2
    ld-linux.so.2 (GLIBC_2.1) => /lib/ld-linux.so.2
/lib/libgcc_s.so.1:
    libc.so.6 (GLIBC_2.1.3) => /lib/libc.so.6
    libc.so.6 (GLIBC_2.2.4) => /lib/libc.so.6
    libc.so.6 (GLIBC_2.4) => /lib/libc.so.6
    libc.so.6 (GLIBC_2.0) => /lib/libc.so.6

appname скомпилировано в Ubuntu 9.10, пытаясь запустить скомпилированный продукт на Centos 5.

Мне кажется, что Centos5 /lib/libc.so.5 предоставляет версию GLIBC_2.4 до версии, но имя приложения вызывает GLIBC_2.8.

Но вот забавная вещь. Эта проблема не возникала, пока я не начал ссылаться на системную библиотеку boost. Раньше это была просто библиотека потоков Boost, но теперь мне нужны и поток, и система. Я сделал компиляцию на этой системе Ubuntu. Сейчас я попытаюсь скомпилировать надстройку для CentO и перенести сгенерированные файлы .a. Я связываюсь с бустом .a файлы между прочим.

Вопрос, как я могу уменьшить эти типы головных болей с контролем версий? Использует ли кто-нибудь какие-то хитрости, такие как настройка среды chroot с более низкими версиями библиотеки, в которой вы собираете продукт? Очевидно, что компиляция на новом дистрибутиве Linux быстро делает ваш продукт несовместимым даже с самой маленькой старой версией Linux. Как люди отправляют двоичные файлы с приличной совместимостью? Да, я могу сделать статическое связывание, но libc не может быть статически правильно связано?

1 Ответ

2 голосов
/ 03 января 2011

Использование среды chroot - один из способов сделать это, но вам не нужна вся эта работа. Вы можете где-то установить более старую эталонную версию вашего SDK (включая libc и другие) и затем заставить gcc ссылаться на нее, а не на библиотеки и заголовки в стандартных системных каталогах. Варианты GCC для этого: -isystem, -isysroot и --sysroot.

Например, gcc от Apple делает это очень часто, связываясь с различными версиями SDK в зависимости от выбранной версии ОС.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...