【发布时间】: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
但是发生了一些错误:
- 警告:找不到入口符号_start;默认为 0000000082000000 => 我通过添加 -lc --entry main 解决了这个问题,警告消息消失了。
- 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