dre*_*nor 4 compiler-construction avr d llvm ldc
提前道歉,因为我对这个主题还不太了解,并且仍在学习编译器的内部工作原理。
我目前正在研究在嵌入式系统中使用 D 的可能性,并发现一篇文章提到 AVR 后端如何合并到上游 LLVM 项目中,以便开发人员可以致力于为他们的语言创建 AVR 支持。D 有 LDC 编译器,它使用 LLVM 后端。不过,这篇文章还提到了 avr-gcc 的使用,这让我对在哪个阶段使用哪些工具从 D 源代码到 AVR 二进制文件有点困惑。我假设 LDC 将源代码转换为 LLVM IR,然后转换为二进制,所以我不确定 avr-gcc 的用途。
有人可以更详细地向我解释这一点吗?
有两个选项可以链接 ldc 吐出的编译目标文件:使用 avr-gcc 的链接器,或使用 llvm 的内部链接器。该参数-gcc=avr-gcc告诉它在哪里可以找到 avr-gcc 工具,或者您--link-internally也可以使用它,它使用 llvm 的内置链接器。两者都会起作用。
使用这个东西的好处-gcc是你可以将它指向你的 arduino studio 安装 - 你可能想要它,因为它有 objcopy、avrdude 等程序以及其他有用的东西 - 并且让它正常工作,并更好地集成与其他库和工具等一起使用,例如 gcc 提供的 C 运行时。
$ 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
Run Code Online (Sandbox Code Playgroud)
使用 PATH 中的 arduino 工具, -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
Run Code Online (Sandbox Code Playgroud)
请注意它链接了,但它给出了有关丢失的警告_start。另请注意不同的文件大小。这是因为 gcc 提供的 C 运行时存根具有该启动符号,它会执行一些基本设置,然后调用您的extern(C) main. 如果没有这个,您将需要自己做更多的事情。我确信您也可以通过在链接命令中列出 lib/object 文件来让 ldc 链接到该文件...但是使用 -avr-gcc ,它就可以工作,因为它已经知道在哪里可以找到所有这些东西。