我正在尝试对驱动程序进行的某些函数调用进行计时。所以我打电话do_gettimeofday
问struct timeval
时间。它编译,但链接器因此抱怨:
drivers/built-in.o: In function `SPC_TIMING_add':
hid-quirks.c:(.text+0x31354): undefined reference to `__aeabi_i2d'
hid-quirks.c:(.text+0x31384): undefined reference to `__aeabi_i2d'
hid-quirks.c:(.text+0x31398): undefined reference to `__aeabi_dadd'
make: *** [.tmp_vmlinux1] Error 1
我尝试直接读取 的值xtime
,并得到相同的结果。
显然,链接顺序存在某种错误,但是由于我不确定从哪里来__aeabi_i2d
,__aeabi_dadd
所以我不知道要编辑哪个makefile。
更新:原来“aeabi”是指 ARM 架构的“嵌入式应用程序二进制接口”(EABI)。该dadd
指令是双精度加法,并且i2d
是整数到双精度的转换(根据this)。我想这意味着我的问题不仅仅是链接,而是说服编译器使用正确的指令或代理指令(这似乎是在 中所做的arch/arm/lib/lib1funcs.S
)。
更新:根据谷歌搜索,__aeabi_dadd
通常别名为__adddf3
,并__aeabi_i2d
别名为__floatsidf
.
更新:仔细查看实际编译器的输出后,发现错误与do_gettimeofday
. 只是注释掉调用do_gettimeofday
允许编译器的优化器删除对执行双精度浮点运算的函数的引用。一旦不再调用该函数,该错误就不会出现。这就是为什么我认为它是由do_gettimeofday
.