Вопрос или проблема
У меня установлены Ubuntu 20.04 и Matlab 2023b.
Когда я запускаю Simulink (часть Matlab), программа выдает ошибку:
Обнаружена несоответствие ld.so: ../elf/dl-tls.c: 517: _dl_allocate_tls_init: Условие 'listp != NULL' не выполнено!
,
что является известной проблемой с новыми версиями Matlab на Linux с glibc старше 2.34.
Официальное исправление ошибки, предложенное MathWorks, состоит в том, чтобы исправить glibc для всей вашей ОС, что в моем случае не желательно.
Я видел одно решение, которое было бы мне подходящим, а именно установить glibc 2.34 локально и затем добавить его путь в переменную LD_LIBRARAY_PATH
только во время запуска Matlab, что позволит лишь Matlab использовать другую версию glibc.
Я следовал этим шагам, чтобы установить glibc 2.34 локально. Я подтвердил, что это работает, с помощью команды:
user@hostname[~]: ~/glibc/glibc-2.34-install/bin/ldd --version
ldd (GNU libc) 2.34
Copyright (C) 2021 Free Software Foundation, Inc.
Это программное обеспечение является бесплатным; условия копирования описаны в источниках.
Авторы не предоставляют НИКАКИХ гарантий, включая гарантии ПРОДАЖИ или УТОЧНЕНИЯ ДЛЯ КОНКРЕТНЫХ ЦЕЛЕЙ.
Авторы: Роланд Макарат и Ульрих Дреппер.
Но после добавления glibc/lib в LD_LIBRARAY_PATH
я получил ошибку сегментации на простых бинарниках, таких как ls
:
user@hostname[~/glibc]❯ export LD_LIBRARY_PATH="/home/dsadowsk/glibc/glibc-2.34-install/lib:$LD_LIBRARY_PATH"
user@hostname[~/glibc]❯ ls
Ошибка сегментации
user@hostname[~/glibc]❯ /opt/matlab/R2023b/bin/matlab
Ошибка сегментации
Это выглядит точно так же, как эта проблема, но, к сожалению, я не очень хорошо понимаю, как работает решение, и оно не работает для Matlab, как и для команды ls
.
user@hostname[~/glibc]❯ /lib64/ld-linux-x86-64.so.2 --library-path /lib64 /bin/ls
build glibc-2.34 glibc-2.34-install glibc-2.34.tar.gz
user@hostname[~/glibc]❯ /lib64/ld-linux-x86-64.so.2 --library-path /lib64 /opt/matlab/R2023b/bin/matlab
/opt/matlab/R2023b/bin/matlab: ошибка при загрузке общих библиотек: /opt/matlab/R2023b/bin/matlab: неверный заголовок ELF
Как я могу запустить бинарник Matlab с установленной локально glibc 2.34, а не для всей моей системы?
Спасибо за любые мысли, которые у вас есть.
Ответ или решение
Решение проблемы с MatLab, связанным с локальной установкой glibc 2.34 на Ubuntu 20.04
Ваша проблема с MatLab (версия R2023b) на Ubuntu 20.04 связана с конфликтом версий glibc. Ошибка о несоответствии, с которой вы столкнулись, связана с тем, что MatLab не поддерживает glibc ниже версии 2.34. Ниже приведено ваше текущее состояние и возможные решения, которые помогут обойти данную проблему без глобальной замены glibc в операционной системе.
Проблема
Вы установили glibc 2.34 локально и изменили переменную окружения LD_LIBRARY_PATH
, чтобы указать на данную библиотеку, но это привело к ошибкам сегментации, как при запуске команд, таких как ls
, так и MatLab.
Причины
Проблема возникает из-за того, что библиотеки glibc, используемые в других программах, могут столкнуться с конфликтами при загрузке. Изменение LD_LIBRARY_PATH
может привести к невозможности правильной загрузки динамически связанных библиотек, которые требуется загрузить для работы системных команд и приложений.
Рекомендации
-
Убедитесь, что вы правильно указываете путь к glibc:
При использовании локальной версии glibc важно не только указать путь вLD_LIBRARY_PATH
, но и убедиться, что вы не мешаете системе загружать свои стандартные библиотеки. -
Используйте локальный загрузчик (dynamic loader):
Вместо того чтобы полагаться только наLD_LIBRARY_PATH
, попробуйте использовать локальный загрузчик, чтобы запустить MatLab с правильным образом загружаемым пространством. Например:/home/dsadowsk/glibc/glibc-2.34-install/lib/ld-linux-x86-64.so.2 --library-path /home/dsadowsk/glibc/glibc-2.34-install/lib:/lib/x86_64-linux-gnu /opt/matlab/R2023b/bin/matlab
Обратите внимание, что вам нужно указать как вашу локальную библиотеку, так и стандартные библиотеки системы.
-
Проверка на наличие проблем с ELF заголовками:
Убедитесь, что библиотеки, которые вы скопировали или установили, соответствуют архитектуре вашей системы (например, x86_64). Несоответствующая архитектура может привести к ошибкам, подобным "invalid ELF header". -
Создание контейнера:
Если вышеуказанные шаги не помогают, вы можете рассмотреть возможность использования контейнеризации с помощью Docker. Это позволит вам создать изолированное пространство, в котором будет установлена необходимая версия glibc, не влияя на вашу основную систему.Пример Dockerfile:
FROM ubuntu:20.04 RUN apt-get update && apt-get install -y build-essential # Команды по установке вашей версии glibc
-
Логи и сообщения об ошибках:
Важно сохранять логи ошибок и сообщения, возникающие при запуске, так как они могут помочь в дальнейшем диагностировании проблемы.
Заключение
Работа с динамическими библиотеками может быть сложной, особенно когда требуется использование специфических версий. Следуя указанным рекомендациям, вы сможете обойти проблему конфликта библиотек и успешно запустить MatLab с необходимой версией glibc. Если проблема сохраняется, рассмотрите возможность обращения в техническую поддержку MathWorks или к сообществу, специализирующемуся на подобной проблематике.