【问题标题】:clang links wrong ARM builtins in thumb modeclang 在拇指模式下链接错误的 ARM 内置函数
【发布时间】:2021-11-22 20:14:38
【问题描述】:

我正在尝试使用 clang 13.0 构建 Cortex-M0(ARMv6,拇指)固件。除了 __udivsi3、__udivmoddi4 处于 ARM 模式等内置函数外,一切似乎都很好。当然,CPU 只支持 thumb 并在尝试执行它们时会出错。我知道这些函数是错误的,因为 CPU 出现故障,调试器将它们显示为 ARM 模式,它们的地址在 .elf have Lsb cleared 中。我正在链接到 gcc 提供的 newlib(libc_nano.a 的 v6 风格),并且 libc 函数是正确的(即拇指模式)。我的 .c 文件中的函数也在拇指模式下正确构建,并且固件运行良好,直到遇到整数除法。

我的编译选项:

clang -o some_file.o -c -MD --target=armv6m-none-eabi -nostdlib 
--sysroot="/path/to/newlib/arm-none-eabi" -fshort-enums -mcpu=cortex-m0
-mthumb -mfloat-abi=soft -g3 -I ../some/includes -Oz -std=gnu11
-Wall -pipe -ffunction-sections -fdata-sections some_file.c

我的链接选项:

clang -o my_project.elf --target=armv6m-none-eabi -nostdlib
-L"/path/to/newlib/arm-none-eabi/lib/." "/path/to/newlib/lib/gcc/arm-none-eabi/9.2.1/libgcc.a"
"/path/to/newlib/arm-none-eabi/lib/thumb/v6-m/nofp/libc_nano.a"
-mcpu=cortex-m0 -mthumb -mfloat-abi=soft -g3 -Wl,--gc-sections
-T my_linker_script.ld object_file1.o object_file2.o object_file3.o -lm

当我尝试--target=arm-none-eabi 或-mtune=cortex-m0 时也会发生同样的情况。我正在使用 clang 13.0.0(来自 github 的官方二进制文件)。我尝试在 Windows 和 Linux 机器上构建。 Clang 将 cortex-m0 列为可用于目标 arm-none-eabi。 llc 在目标列表中列出 thumb(我自己的所有函数都在 thumb 模式下正确构建)。

我做错了什么?

感谢您的帮助

【问题讨论】:

  • 你是否能够编译一个简单的 c 文件以对象(没有任何其他库等)到目标 armv6-m 设备。铿锵的最后一两个主要版本我无法使用通用构建的工具来做到这一点。 (--target=) 在最近的版本中,我可以让 clang 工作的唯一方法是专门为架构 (armv6-m) 构建它,并且效果很好。您是遇到这个问题还是只处理告诉工具要链接哪个库?
  • clang/llvm 随着时间的推移改变了您指定目标的方式,我在 7.x.x 左右停止使用 clang,因为我无法再维护一组适用于不同主要版本的 makefile。现在我为目标构建了二进制文件,我可以再次使用 clang/llvm 工具。 YMMV

标签: arm clang llvm thumb


【解决方案1】:

我追查到错误的libgcc.a 被链接。执行 arm-none-eabi-gcc -print-libgcc-file-name 时我没有提供正确的架构/拇指标志,它提供了在 ARM 模式下构建的库的默认版本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-13
    • 2013-09-01
    • 1970-01-01
    • 2016-03-31
    • 2012-10-02
    • 1970-01-01
    • 1970-01-01
    • 2018-01-30
    相关资源
    最近更新 更多