Как правильно подойти к вопросу: сломался компоновщик ld.lld из набора LLVM lld для macOS. Что делать?

Ссылка скопирована
1 ответ

Сейчас ситуация такая: 3 месяца назад я пользовался компоновщиком ld.lld для elf файлов, я ничего не делал (как мне кажется), сейчас вернулся чтобы снова что нибудь собрать, я ввожу команду:

По вводным: ld.lld -T linker.ld -o kernel --oformat binary kernel.o

И получаю теперь это:

По вводным: dyld[42098]: Symbol not found: __ZN4llvm16writeIndexToFileERKNS_18ModuleSummaryIndexERNS_11raw_ostreamEPKNSt3__13mapINS5_12basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEENS_8DenseMapIyPNS_18GlobalValueSummaryENS_12DenseMapInfoIyvEENS_6detail12DenseMapPairIySF_EEEENS5_4lessISC_EENSA_INS5_4pairIKSC_SL_EEEEEEPKNS5_13unordered_setISF_NS5_4hashISF_EENS5_8equal_toISF_EENSA_ISF_EEEE
По вводным: referenced from: /usr/local/Cellar/lld/19.1.6/lib/liblldELF.dylib
По вводным: expected in: /usr/local/Cellar/llvm/20.1.8/lib/libLLVM.dylib
По вводным: zsh: abort ld.lld -T linker.ld -o kernel --oformat binary kernel.o

Сейчас ситуация такая: то есть это какая-то проблема внутри самого компоновщика, что можно попробовать, что удалить/переустановить? Спасибо

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Игорь NetOps Ответ

Ошибка dyld Symbol not found почти наверняка означает несовместимость версий lld и llvm в Homebrew. У вас liblldELF.dylib от lld 19.1.6 пытается найти символ в libLLVM.dylib от llvm 20.1.8. То есть бинарник/библиотека lld собраны под одну версию LLVM, а во время запуска подхватывается другая.

Сначала проверьте, что именно запускается:

which ld.lld
ld.lld --version
brew list --versions llvm lld
otool -L $(which ld.lld)

which ld.lld ld.lld --version brew list --versions llvm lld otool -L $(which ld.lld)

Самое простое решение - привести llvm и lld к согласованному состоянию. Обычно помогает переустановка и relink:

brew update
brew reinstall llvm lld
brew unlink llvm lld
brew link llvm --force
brew link lld --force

brew update brew reinstall llvm lld brew unlink llvm lld brew link llvm --force brew link lld --force

Если после этого ошибка остается, проверьте DYLD_LIBRARY_PATH, PATH и старые файлы в /usr/local/Cellar. На macOS Intel Homebrew обычно в /usr/local, на Apple Silicon - /opt/homebrew. Если в PATH смешаны обе установки или старые симлинки, dyld может брать библиотеку не оттуда.

echo $PATH
echo $DYLD_LIBRARY_PATH
brew doctor

echo $PATH echo $DYLD_LIBRARY_PATH brew doctor

Можно также попробовать запускать lld из комплекта llvm напрямую, а не отдельный пакет lld:

/usr/local/opt/llvm/bin/ld.lld --version
/usr/local/opt/llvm/bin/ld.lld -T linker.ld -o kernel --oformat binary kernel.o

/usr/local/opt/llvm/bin/ld.lld --version /usr/local/opt/llvm/bin/ld.lld -T linker.ld -o kernel --oformat binary kernel.o

Для сборки kernel/bare metal проекта я бы зафиксировал toolchain, чтобы через три месяца Homebrew не обновил LLVM под ногами. Например, использовать Docker/VM или конкретную версию LLVM, либо хранить toolchain отдельно.

Итог: компоновщик не “сломался сам”, у вас ABI mismatch между lld и LLVM. Лечится синхронизацией пакетов, чисткой старых ссылок и запуском ld.lld из одного комплекта LLVM. После исправления проверьте otool -L: liblld и libLLVM должны ссылаться на согласованные версии.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

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

Вам также может быть интересно