参考博客:
解决undefined reference to `__aeabi_uidivmod\'和undefined reference to `__aeabi_uidiv\'错误-草根老师-ChinaUnix博客自己写裸机驱动程序时,使用了除法,在链接的时候出了如下错误:??使用的编译器是:??后来上网搜了一下原因,由于编译器不支持除法运算,但是也没有搜到解决方案。看了一下http://blog.chinaunix.net/uid-26833883-id-3282967.html
1. 问题背景及源码
最近调试代码的时候遇到了以下的编译问题,查看网上的解决方法顺利解决,顺便自己记录一下
//#include <stdio.h>
/* in case compiler error */
#if 0
int raise(int param)
{
return 0;
}
#endif
int mod(int a, int b)
{
return (a % b);
}
int div(int a, int b)
{
return (a / b);
}
int main(void)
{
int a = 10;
int b = 3;
int c = 0;
int d = 0;
c = mod(a, b);
d = div(a, b);
return 0;
}
2. 问题原因
问题的原因其实报错信息中已经说出来了,在mod与div函数中使用了求余%与除法/运算,而编译器不支持上述两种运算,导致链接的时候找不到定义而报错
3. 解决方法
需要链接gcc库即可解决
如下是路径,只要在Makefile中指定即可
.PHONY:all
TARGET:=test
LDFLAGS:= -lgcc -L/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/lib/gcc/arm-linux-gnueabihf/4.9.4
objects = start.o main.o
all:$(TARGET).bin
$(TARGET).bin:$(objects)
#arm-linux-gnueabihf-ld -Timx6u.lds -o $(TARGET).elf $^
arm-linux-gnueabihf-ld -Timx6u.lds -o $(TARGET).elf $^ $(LDFLAGS)
arm-linux-gnueabihf-objcopy -O binary -S $(TARGET).elf $@
%.o:%.c
arm-linux-gnueabihf-gcc -nostdlib -c -o $@ $<
%.o:%.s
arm-linux-gnueabihf-gcc -nostdlib -c -o $@ $<
clean:
-rm -rf *.o *.bin *.elf *.imx
4. 新的报错
按照上述的改法链接的库以后,又出现了新的报错如下:
对raise函数未定义的引用
?解决方法是我们自己实现一个raise函数即可,如源码部分把条件编译放开即可,最终结果如下:
?
?
|