Qualcomm открывает возможности: компоновщик ELD теперь доступен как open-source проект для встраиваемых систем

Компания Qualcomm выпустила в открытый доступ проект ELD: Embedded LD, содержащий код компоновщика ELD, который используется в их компиляторском пакете (основанном на LLVM) и адаптирован для связывания объектных файлов в проекте для встраиваемых систем.

Проект ELD учитывает специфические особенности, такие как активное использование linker-скриптов и необходимость в доработке и расширении процесса компоновки. Исходный код написан на C++ и доступен на GitHub под лицензией BSD.

Как сообщает OpenNET, ELD может эффективно заменить GNU linker, потребляя меньше оперативной памяти, обеспечивая более высокую скорость связывания и позволяя модифицировать процесс компоновки.

Архитектура ELD позволяет легко добавлять поддержку новых платформ через подключение бэкендов. В настоящее время реализованы бэкенды для платформ Qualcomm Hexagon NPU, AArch32, AArch64 и RISC-V (с расширениями Xqiu). Основой для разработки служит MCLinker.

В Qualcomm компоновщик ELD активно используется в различных областях, включая создание прошивок и драйверов, подготовку компонентов для TrustZone, сбор продуктов для AI, 5G-модемов и беспроводных сетевых устройств, а также разработку образов Zephyr RTOS для архитектур AArch32, AArch64 и RISC-V и создания прошивок для микроконтроллеров на основе RISC-V.

Ключевые функции ELD включают:

— статическое, динамическое и частичное связывание (с опцией «-relocatable»);
— работу с форматом ELF (Executable and Linking Format);
— поддержку оптимизации на этапе связывания (Link-Time Optimization, LTO) и специальных оптимизаций, таких как слияние строк;
— совместимость с GNU ld по командам командной строки;
— соответствие методам разрешения символов и работы с входными файлами и генерацией исполняемых файлов, используемых в утилитах GNU;
— поддержку linker-скриптов для управления связыванием, с синтаксисом, идентичным скриптам для GNU ld;
— возможность создания подробных и читаемых карт связывания (map-файлов) для ручной диагностики и автоматизированной генерации отчетов;
— поддержку плагинов, позволяющих изменять поведение компоновщика и добавлять новые стадии компоновки, а также передавать дополнительную информацию от компилятора;
— функциональность воспроизведения (reproduce), позволяющая создавать tar-архивы для воссоздания компоновки без зависимостей, полезные для анализа возникающих проблем;
— расширенные возможности диагностики, особенно для сложных проблем, как, например, сбор мусора при обработке отладочных символов.