我是新生,我想学习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
但是发生了一些错误:
以上是我的问题。 谢谢大家阅读。
答案 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并不知道。