我是新生,我想学习ARM汇编语言并使用gnu工具链,所以我决定从小型项目开始,它将arm-assembly文件和C文件混合在一起gnu toolchain。我的想法是调用在汇编文件中定义的函数。
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
但是发生了一些错误:
以上是我的问题。谢谢大家的阅读。
试试这个
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没有。