【问题标题】:How to fix ".c:6: undefined reference to 'printf'如何修复“.c:6: undefined reference to 'printf'
【发布时间】:2019-08-30 12:54:14
【问题描述】:

我是新生,我​​想学习ARM汇编语言和使用gnu工具链,所以我决定从一个通过gnu工具链混合arm-assembly文件和C文件的小项目开始。我的想法是调用汇编文件中定义的函数。

多.S:

   .globl multi
multi:
    str     fp,[sp,#-4]!
    add     fp,sp,#0
    sub     sp,sp,#12
    str     r0,[fp,#-8]
    str     r1,[fp,#-12]
    ldr     r3,[fp,#-8]
    ldr     r2,[fp,#-12]
    mul     r1,r2,r3
    mov     r3,r1
    mov     r0,r3
    add     sp,fp,#0
    ldr     fp,[sp],#4
    bx      lr

multi.c:

#include <stdio.h>
unsigned int multi(unsigned int a, unsigned int b);

int main(int argc, char *argv[]){
    unsigned int x = multi(3,4);
    printf("%u\n",x);
    return 0;
}

然后我尝试使用以下命令将它们链接在一起:

arm-none-eabi-gcc -g -c -o multi-arm.o multi.S
arm-none-eabi-gcc -g -c -o multi.o multi.c
arm-none-eabi-ld multi.o multi-arm.o -o multi.elf

但是发生了一些错误:

  1. 警告:找不到入口符号_start;默认为 0000000082000000 => 我通过添加 -lc --entry main 解决了这个问题,警告消息消失了。
  2. multi.c:6:未定义对“printf”的引用。我被这个错误困住了,我花了 2 个小时寻找解决方案,但我仍然无法修复它。

以上是我的问题。 谢谢大家的阅读。

【问题讨论】:

  • 您的代码中没有printf?你运行的代码和这个不一样吗?
  • 我没有看到您在提供printf 符号的库或目标文件中进行链接,因此很清楚为什么链接编辑器无法找到它。
  • 对不起。我试图删除 printf 以查看代码是否会运行并忘记再次编写它
  • 我能够通过将ld 替换为gcc 并添加--specs=nosys.specs 来构建它。见stackoverflow.com/questions/17633115/…stackoverflow.com/questions/19419782/…
  • 感谢您的帮助,我是按照 Jeff 的指南完成的:arm-none-eabi-gcc --specs=nosys.specs -o multi.elf multi.o multi-arm.o

标签: c assembly arm gnu toolchain


【解决方案1】:

试试这个

arm-none-eabi-as -g -o multi-arm.o multi.S
arm-none-eabi-gcc -g -o multi.elf multi.c multi-arm.o

如果您想直接使用链接器,则必须在命令行中提供 C 库的路径。当 Gcc 调用链接器时,它知道库在哪里(相对于它执行和编译的位置),但由于某些奇怪的原因 ld 不知道。

【讨论】:

  • 谢谢,我尝试了您的指南,它与 arm-eabi 工具链配合得很好,但在 arm-none-eabi 工具链上,出现了一些错误,我通过添加:--spec-nosys 来修复它.specs
  • 大多数 C 库调用都需要一个系统,printf 很可能是最糟糕的使用方法之一。因此,如果您不是针对在操作系统上运行的东西进行交叉编译,比如运行 linux 的树莓派,那么 arm-none-eabi 是有意义的,但 printf 或其他 C 库调用则没有。我先在没有这些调用的情况下学习,然后再弄清楚如何在其中获取 newlib 或其他内容。
  • 这里的问题与简单的工具使用无关,你想调用一个需要链接的外部函数。
猜你喜欢
  • 2013-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-28
  • 1970-01-01
  • 2011-12-19
  • 1970-01-01
相关资源
最近更新 更多