编译驱动的过程中,碰到了如下的问题:
在网上查询到,是由于编译器不支持除法运算导致的。
依照上文将libgcc.a引入,在此case需要从链接脚本添加。
结果引入了更多的错误,只能寻找另外的方法。
Stack Overflow上这个问题引起了我的注意:
linux device driver - WARNING: "__aeabi_uldivmod" Undefined symbol in opendla.ko - Stack Overflow
从这里可以看到我们遇到的问题同样是出在uldiv上,是64位除法。其中一个回答给出的方法是,使用div_u64接口代替64位除法运算。
那么我们只需要找出代码里64位除法的位置,然后对其做替换就可以了。
对驱动目标文件做反汇编:
<交叉工具链前缀>-objdump -j .text -ld -C -S <目标文件>.o > <输出的文本文件> #反汇编+显示行号
在得到的文本里查找__aeabi_uldivmod,发现只有一处:
对应到代码的位置,进行修改,使用div_u64进行除法运算。
修改之后,编译通过。