我正在尝试计算一些驱动程序调用的函数。所以我打电话给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。
UPDATE :原来“aeabi”表示ARM体系结构的“嵌入式应用程序二进制接口”(EABI)。 dadd
指令是双精度加法,i2d
是整数到双精度转换(根据this)。我想这意味着我的问题不仅仅是链接,而是说服编译器使用正确的指令或代理指令(这似乎是arch/arm/lib/lib1funcs.S
中正在进行的操作)。
更新:根据Google搜索,__aeabi_dadd
的别名通常为__adddf3
,而__aeabi_i2d
的别名为__floatsidf
。< / p>
UPDATE :仔细查看实际编译器的输出后,发现该错误与do_gettimeofday
无关。只是注释掉对do_gettimeofday
的调用允许编译器的优化器删除对正在执行双精度浮点运算的函数的引用。一旦不再调用该函数,就不会出现错误。这就是为什么我认为它是由do_gettimeofday
引起的。
答案 0 :(得分:2)
如果你在内核中,你可能不应该使用do_gettimeofday()
。
我认为正确的方法是使用ktime
系列函数,例如:
ktime_t start, end, delta;
start = ktime_get();
...
end = ktime_get();
delta = ktime_sub(end, start);
ktime.h
中有一堆转换例程,用于将delta
转换为毫秒/秒/秒秒。