驱动实现过程中涉及到浮点计算,使用整型数据放大处理会溢出导致结果错误(在内核中不建议使用浮点计算相关处理,故网上相关的资料比较少),经多方查找,终于找到了在内核中链接libgcc库的方法,主要参照以下两个链接:
1、linux内核编译中undefined reference to `__aeabi_i2d'的解决办法
2、undefined reference to `raise' 解决方法
一、修改link_vmlinux.sh脚本文件中的vmlinux_link()函数
内核跟目录下使用find命令(find . -name link_vmlinux.sh)查找脚本文件路径,找到后打开(vi ./linux-3.10/scripts/link-vmlinux),vmlinux_link()内容如下:
vmlinux_link()
{
local lds="${objtree}/${KBUILD_LDS}"
if [ "${SRCARCH}" != "um" ]; then
${LD} ${LDFLAGS} ${LDFLAGS_vmlinux} -o ${2} \
-T ${lds} ${KBUILD_VMLINUX_INIT} \
--start-group ${KBUILD_VMLINUX_MAIN} --end-group ${1} -L/opt/yltl_20190121/cqr40_ubuntu16_bv3//brandy/gcc-linaro/lib/gcc/arm-linux-gnueabi/4.6.3 -lgcc
else
${CC} ${CFLAGS_vmlinux} -o ${2} \
-Wl,-T,${lds} ${KBUILD_VMLINUX_INIT} \
-Wl,--start-group \
${KBUILD_VMLINUX_MAIN} \
-Wl,--end-group \
-lutil ${1}
rm -f linux
fi
}
加入红色部分(libgcc绝对路径)(根据实际路径替换为自己的路径即可)(可通过find . -name libgcc.a确认链接库路径)
二、修改完link-vmlink.sh后编译出现如下错误
再次编译,会出现undefined reference to `raise',解决方法如下:
在工程文件夹中任一.c文件中添加 int raise(void)函数,具体如下:
int raise(void)
{
return 0;
}
问题解决!