如何修复“ .c:6:对'printf'的未定义引用

时间:2019-04-09 09:18:56

标签: c assembly arm gnu toolchain

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

multi.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'的未定义引用。我被这个错误困住了,我花了两个小时寻找溶液,但是我仍然无法解决它。

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

1 个答案:

答案 0 :(得分:0)

尝试一下

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并不知道。