Как работает поддержка AVR с LLVM для разных языков?
Заранее извиняюсь, так как я еще не слишком хорошо разбираюсь в этой теме и все еще изучаю внутреннюю работу компиляторов.
В настоящее время я изучаю возможность использования D во встроенных системах и нашел статью, в которой упоминается, как серверная часть AVR была объединена с исходным проектом LLVM, чтобы разработчики могли работать над созданием поддержки AVR для своих языков.D имеет компилятор LDC, который использует бэкэнд LLVM. В статье также упоминается использование avr-gcc, что оставляет меня немного запутанным в отношении того, какие инструменты используются на каком этапе для перехода от D-исходного кода к двоичному файлу AVR. Я бы предположил, что LDC преобразует исходный код в LLVM IR, а затем в двоичный, поэтому я не уверен, для чего используется avr-gcc.
Может ли кто-нибудь объяснить мне это более подробно, возможно?
1 ответ
Существует два варианта компоновки скомпилированных объектных файлов, которые выдает ldc: с помощью компоновщика avr-gcc или с помощью внутреннего компоновщика llvm. Аргумент-gcc=avr-gcc
говорит ему, где найти инструменты avr-gcc, или вы можете использовать--link-internally
вместо этого используется встроенный компоновщик llvm. Оба будут работать.
Хорошая вещь в использовании-gcc
дело в том, что вы можете указать его на установку своей студии arduino — что вам, вероятно, все равно нужно, поскольку в нем есть программы objcopy, avrdude и т. д., а также другие полезные вещи — и пусть он просто работает и лучше интегрируется с другими библиотеками и инструментами и например, среда выполнения C, которую предоставляет gcc.
$ PATH=/opt/arduino/arduino-1.8.10/hardware/tools/avr/bin:$PATH ldc2 -betterC -Oz -mtriple=avr -mcpu=atmega328p -gcc=avr-gcc delay.d
$ file delay
delay: ELF 32-bit LSB executable, Atmel AVR 8-bit, version 1 (SYSV), statically linked, with debug_info, not stripped
$ ls -l delay
-rwxr-xr-x 1 me users 2440 Sep 18 08:28 delay
С инструментами arduino в PATH аргумент -gcc=avr-gcc просто работает.
С --link-internally вам ничего из этого не нужно, но:
$ ldc2 -betterC -Oz -mtriple=avr -mcpu=atmega328p --link-internally delay.d
lld: warning: cannot find entry symbol _start; defaulting to 0x110B4
$ file delay
delay: ELF 32-bit LSB executable, Atmel AVR 8-bit, version 1 (SYSV), statically linked, not stripped
$ ls -l delay
-rwxr-xr-x 1 me users 708 Sep 18 08:31 delay
Обратите внимание, что он связан, но он выдал предупреждение об отсутствующем_start
. Также обратите внимание на разный размер файла. Это связано с тем, что заглушки времени выполнения C, которые предоставляет gcc, имеют этот символ запуска, который выполняет некоторую базовую настройку, а затем вызывает вашextern(C) main
. Без этого вам нужно будет сделать немного больше самостоятельно. Я уверен, что вы также можете заставить ldc связать это, перечислив файлы lib/object в команде ссылки ... но с -avr-gcc это просто работает, поскольку он уже знает, где найти все это.