Является ли lld-линкер заменой ld и gold?
Компоновщик из проекта LLVM lld
в настоящее время разрабатывается с новыми функциями, добавляемыми неделю за неделей. Разработчики обещают, что lld
быстрее чем ld
, Как это конкурировать по сравнению с gold
?
Является ли замена для замены ld
? С золотом есть несколько обручей для прыжков.
3 ответа
Один из разработчиков LLD, Руи Уэяма, оглядывается на прогресс, достигнутый LLD в 2016 году, см. Http://lists.llvm.org/pipermail/llvm-dev/2016-De декабря/107981.html.
- "Теперь я почти уверен, что этот [LLD] станет серьезной (и, на мой взгляд, лучшей) альтернативой существующим компоновщикам GNU [..]".
- "LLD теперь может связывать большинство пользовательских программ x86-64".
- "Проект FreeBSD, и мы пытаемся сделать LLD системным компоновщиком по умолчанию для операционной системы, и, за исключением нескольких сложных программ, таких как ядро или загрузчик, компоновщик работает в основном нормально". Уже достигнуто!
- "LLD поддерживает x86, x86-64, x32, AArch64, AMDGPU, ARM, PPC64 и MIPS32/64, хотя полнота варьируется".
- "[T] здесь уже есть несколько систем, которые используют LLD в качестве системных компоновщиков, таких как CloudABI или Fuchsia. У Chromium и Clang/LLVM есть варианты сборки, чтобы использовать LLD для их построения".
И в качестве бонуса:
- "LLD стал быстрее [..] В начале этого года LLD потребовалось около 16 секунд для создания исполняемого файла clang (отладочная сборка) объемом 1,5 ГБ. Теперь для одноядерного процесса требуется около 14,5 секунд, а для 20 ядер - 8,5 секунд. Ld.gold занимает около 25 секунд и 20 секунд, соответственно. [..] Если у вас проблема с слишком долгим временем соединения, я бы рекомендовал попробовать LLD. "
Обновление весны 2017 г. По словам одного из разработчиков, "LLD/ELF теперь готов к производственному использованию, по крайней мере, для x86-64 (и, вероятно, для AArch64 и MIPS).", См. http://lists.llvm.org/pipermail/llvm-dev/2017-March/111083.html Он также содержит краткое описание того, как использовать LLD.
Сама программа заявляет о цели совместимости и, кажется, отлично работает на простых тестах.
Например, на Ubuntu 20.04 я устанавливаю:
sudo apt install lld
lld --version
говорит:
LLD 10.0.0 (compatible with GNU linkers)
и я могу скомпилировать C hello world с
-fuse-ld=lld
:
gcc -fuse-ld=lld -ggdb3 -O0 -std=c11 -Wall -Wextra -pedantic -o hello.out hello.c
Тест производительности против золота
Скоро я задокументирую результаты по адресу: Замена ld на gold - есть опыт?
FreeBSD / OpenBSD используют lld в качестве системного компоновщика. FreeBSD делает это для всех поддерживаемых архитектур, для OpenBSD мы делаем это для всех минус mips64 на данный момент (amd64 arm i386 powerpc - порты aarch64 powerpc64 riscv64 были с нуля и никогда не использовали компоновщик BFD, но используют lld). Мы собираем всю ОС и 99,9999% дерева портов. Я могу сосчитать по пальцам одной руки, сколько осталось тех, кто этого не делает.
Это определенно намного быстрее для больших проектов, особенно для больших проектов C++, таких как Chrome, Firefox, Thunderbird, KDE и т. д. Также меньше использование памяти, что может быть проблематично для 32-битных арок.