Проблема с запуском бинарника, построенного для 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?
-
Проверить версии glibc и libpthread на целевой и хост системе:
Выполните:
bash
readelf -W -s /lib/libpthread.so.0 | grep pthreadcondЭто покажет, какие версии функций доступны.
-
Использовать систему с glibc < 2.34, например Debian Bullseye, чтобы сравнить и оценить, присутствует ли там нужный символ.
-
Настроить правильные переменные окружения, например
LD_PRELOAD
, чтобы загрузить нужную версию библиотеки вручную, хотя в некоторых случаях это не помогает из-за интеграции библиотек. - Рассмотреть возможность сборки бинарника под целевую систему или использовать контейнеры для создания среды с нужной версией glibc.
Выводы и рекомендации
Проблема с несовместимостью версий glibc — частая при переносе бинарников между системами с разными версиями glibc и особенность интеграции libpthread
в libc
усложняет поддержку. Наиболее надёжное решение — это либо запускать бинарники в средах с соответствующими версиями glibc, либо пересобирать их под целевую платформу.
Используйте возможности отладки линковщика (LD_DEBUG
) и анализируйте символы с помощью readelf
для понимания проблем с версиями. Это поможет выявить, какие символы ищет программа и где они должны присутствовать.
Ключевые слова для SEO
- glibc версия
- ошибка GLIBC_2.25 не найдена
- libpthread в glibc
- совместимость бинарников с glibc
- отладка символов glibc
- интеграция libpthread в libc
- Debian glibc версии
- запуск бинарника на другой версии glibc