Что означает код errno 87 (ESHLIBVERS)?

 
Также может означать:
КонстантаТипОС
ERROR_INVALID_PARAMETERОшибка WindowsWindows
EUSERSerrnoLinux
ELIBEXECerrnoSolaris
XNS_INTERNAL_ERRORКод BSODWindows
Предыдущий Следующий
EUSERS ELIBEXEC

ESHLIBVERS

ESHLIBVERS — результат загрузки программ Darwin для несовпадения версии общей библиотеки. Это не просто «библиотека отсутствует». Документация Apple по динамическим библиотекам описывает проверку совместимости зависимостей: до загрузки dyld сравнивает текущую версию библиотеки на диске с версией совместимости, записанной при компоновке клиента. Если текущая версия старше требуемой версии совместимости, зависимая библиотека не загружается.

Это проблема совместимости ABI. Библиотека может находиться по ожидаемому пути и иметь совместимую процессорную архитектуру, но всё равно быть слишком старой для клиентского двоичного файла. И наоборот, переименование или копирование произвольной более новой на вид .dylib не доказывает, что библиотека предоставляет нужный клиенту ABI.

Какие данные собрать

  • Выполните otool -L <client> и otool -L <library>; Apple документирует эту команду для просмотра текущей версии и версии совместимости.
  • Используйте otool -l, если необходимо сравнить install name или команды загрузки. Формат Mach-O применяет LC_LOAD_DYLIB в клиентах и LC_ID_DYLIB в динамических библиотеках.
  • Запишите точный клиент, разрешённый путь к библиотеке и оба значения версии. Эти сведения отличают ошибку версии от отсутствующего файла, повреждённого образа Mach-O или неверной архитектуры.

Правильное устранение

Разверните ревизию библиотеки, заявленная версия совместимости которой удовлетворяет требованиям клиента, либо пересоберите клиент и библиотеку как совместимый комплект. Рекомендации Apple по проектированию библиотек предлагают использовать отдельный install name для несовместимой основной ревизии, а не позволять клиентам случайно связываться с библиотекой, ABI которой изменился.

Документированное сравнение версий применяется к зависимым библиотекам. Библиотека, открываемая напрямую через dlopen, проходит другой путь; сохраните dlerror() для этого вызова, а не считайте любое сообщение динамической загрузки случаем ESHLIBVERS.

Ссылки


Нужно найти другой код? Найти другой код состояния или ошибки.