【问题标题】:How does AVR support with LLVM work for different languages?AVR 对 LLVM 的支持如何适用于不同的语言?
【发布时间】:2022-09-18 20:33:48
【问题描述】:

提前道歉,因为我对该主题还不太了解,并且仍在学习编译器的内部工作原理。

我目前正在调查在嵌入式系统中使用 D 的可能性,并发现 article 提到 AVR 后端如何合并到上游 LLVM 项目中,因此开发人员可以为他们的语言创建 AVR 支持。 D 有 LDC 编译器,它使用 LLVM 后端。这篇文章还提到了 avr-gcc 的使用,这让我对在从 D 源代码到 AVR 二进制文件的哪个阶段使用哪些工具感到有些困惑。我会假设 LDC 将源代码转换为 LLVM IR,然后再转换为二进制,所以我不确定 avr-gcc 的用途。

谁能更详细地向我解释一下?

  • avr-gcc 是另一个存在已久的 AVR 工具链,使用 GCC 而不是 LLVM 基础架构。它们不相关。

标签: compiler-construction llvm d avr ldc


【解决方案1】:

有两个选项可以链接 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

使用 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

请注意它已链接,但它给出了关于缺少 _start 的警告。还要注意不同的文件大小。这是因为 gcc 提供的 C 运行时存根具有该开始符号,它会执行一些基本设置,然后调用您的 extern(C) main。没有它,您将需要自己做更多的事情。我敢肯定,您也可以通过在链接命令中列出 lib/object 文件来让 l​​dc 进行链接……但是使用 -avr-gcc,它可以正常工作,因为它已经知道在哪里可以找到所有这些东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    • 2015-08-03
    • 1970-01-01
    相关资源
    最近更新 更多