Почему старая Linux-программа не запускается на новой системе с ошибкой «/lib/arm-linux-gnueabihf/libpthread.so.0: версия `GLIBC_2.25′ не найдена»?

Проблема с запуском бинарника, построенного для glibc 2.25, на системе с glibc 2.36

Не так давно возникает вопрос, как запустить бинарник, построенный для встроенного устройства с glibc версии 2.25, на тестовой системе с Debian stable и glibc 2.36. Многие бинарные файлы, собранные для старой версии системы, запускаются без проблем. Однако один из них выдает ошибку:

./Demo: /lib/arm-linux-gnueabihf/libpthread.so.0: version `GLIBC_2.25′ not found (required by ./Demo)

Это означает, что программа пытается найти функцию в библиотеке libpthread.so.0, которая отсутствует в установленной версии glibc.


Причина проблемы и особенности glibc

Вероятно, данная ошибка связана с тем, что начиная с glibc версии 2.34, библиотека libpthread была интегрирована непосредственно в libc, что повлияло на то, как версии символов и функций предоставляются. На более новых системах libpthread.so.0 фактически содержит только заглушки, а все функции находятся в libc.so.6.

В системе с glibc 2.25 функция pthread_cond_clockwait присутствует в libpthread.so.0:

226: 0000d1e0 900 FUNC GLOBAL DEFAULT 12 pthread_cond_wait@@GLIBC_2.4
251: 0000d564 1092 FUNC GLOBAL DEFAULT 12 pthread_cond_timedwait@@GLIBC_2.4
295: 0000d9a8 1104 FUNC GLOBAL DEFAULT 12 pthread_cond_clockwait@@GLIBC_2.25

На новых системах такой символ уже отсутствует или перенесён в другую библиотеку.


Как отлаживать проблему с символами glibc

Для понимания того, как система находит и разрешает символы, можно использовать отладку линковщика:

bash
LD_DEBUG_OUTPUT=/tmp/ld.txt LD_DEBUG=all ./Demo

После выполнения этого команда сгенерирует подробный лог в /tmp/ld.txt, где будет видно, какие версии символов загружены и из каких библиотек, а также пути поиска. Это помогает определить, обращается ли система к целевой (старой) библиотеке или же к библиотекам хоста.


Что делать при проблеме с символами pthread?

  1. Проверить версии glibc и libpthread на целевой и хост системе:

    Выполните:

    bash
    readelf -W -s /lib/libpthread.so.0 | grep pthreadcond

    Это покажет, какие версии функций доступны.

  2. Использовать систему с glibc < 2.34, например Debian Bullseye, чтобы сравнить и оценить, присутствует ли там нужный символ.

  3. Настроить правильные переменные окружения, например LD_PRELOAD, чтобы загрузить нужную версию библиотеки вручную, хотя в некоторых случаях это не помогает из-за интеграции библиотек.

  4. Рассмотреть возможность сборки бинарника под целевую систему или использовать контейнеры для создания среды с нужной версией glibc.

Выводы и рекомендации

Проблема с несовместимостью версий glibc — частая при переносе бинарников между системами с разными версиями glibc и особенность интеграции libpthread в libc усложняет поддержку. Наиболее надёжное решение — это либо запускать бинарники в средах с соответствующими версиями glibc, либо пересобирать их под целевую платформу.

Используйте возможности отладки линковщика (LD_DEBUG) и анализируйте символы с помощью readelf для понимания проблем с версиями. Это поможет выявить, какие символы ищет программа и где они должны присутствовать.


Ключевые слова для SEO

  • glibc версия
  • ошибка GLIBC_2.25 не найдена
  • libpthread в glibc
  • совместимость бинарников с glibc
  • отладка символов glibc
  • интеграция libpthread в libc
  • Debian glibc версии
  • запуск бинарника на другой версии glibc

Источник

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *