尝试使用do_gettimeofday()测量内核中的时间时发生链接错误

时间:2012-08-12 06:40:04

标签: time linux-kernel linker-errors

我正在尝试计算一些驱动程序调用的函数。所以我打电话给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引起的。

1 个答案:

答案 0 :(得分:2)

如果你在内核中,你可能不应该使用do_gettimeofday()

我认为正确的方法是使用ktime系列函数,例如:

ktime_t start, end, delta;

start = ktime_get();
...
end = ktime_get();

delta = ktime_sub(end, start);

ktime.h中有一堆转换例程,用于将delta转换为毫秒/秒/秒秒。