编译内核模块时“__floatsidf”未定义警告

时间:2013-06-21 15:11:57

标签: c linux-kernel

我正在编写一个可加载的内核模块,当尝试编译它时,链接器失败并显示以下消息:

*** Warning: "__floatsidf" [/testing/Something.ko] undefined!

我不使用浮点变量,所以不是这样。造成这种错误的原因是什么?

注意:我正在使用Linux ubuntu kernel v. 3.5.0-23-generic

2 个答案:

答案 0 :(得分:7)

__floatsidf是一个运行时例程,用于将32位有符号整数转换为双精度浮点数。项目中的某个位置如下所示:

double foo = bar;

或类似的东西,其中bar是32位整数。也可能是你正在调用libm函数之一(或任何其他函数,实际上),它期望double具有整数参数:

foo = pow(bar, baz);

其中barbaz(或两者)都是整数。

如果没有显示某些代码,我们无法提供更多帮助。

要缩小范围,请检查编译器生成的目标文件(在链接它们之前)并查看反汇编以获取对该符号的引用 - 这应该告诉您它正在发生什么功能。

这是我的意思的一个例子。首先 - 源代码:

#include <math.h>

int function(int x, int y)
{
    return pow(x, y);
}

非常简单,对吧?现在,我将为ARM编译并反汇编:

$ clang -arch arm -O2 -c -o example.o example.c
$ otool -tV example.o 
example.o:
(__TEXT,__text) section
_function:
00000000    e92d40f0    push    {r4, r5, r6, r7, lr}
00000004    e28d700c    add r7, sp, #12
00000008    e1a04001    mov r4, r1
0000000c    ebfffffb    bl  ___floatsidf
00000010    e1a05000    mov r5, r0
00000014    e1a00004    mov r0, r4
00000018    e1a06001    mov r6, r1
0000001c    ebfffff7    bl  ___floatsidf
00000020    e1a02000    mov r2, r0
00000024    e1a03001    mov r3, r1
00000028    e1a00005    mov r0, r5
0000002c    e1a01006    mov r1, r6
00000030    ebfffff2    bl  _pow
00000034    ebfffff1    bl  ___fixdfsi
00000038    e8bd40f0    pop {r4, r5, r6, r7, lr}
0000003c    e12fff1e    bx  lr

请注意 - 两次调用__floatsidf,一次调用__fixdfsi,将xy的两次转换与double进行匹配,然后进行转换返回类型返回int

答案 1 :(得分:4)

您正在某处使用浮点 - 您的模块包含从intdouble的转换。它可能就像调用一个带有double参数并传递int的函数一样简单。

您可以尝试在代码中搜索“double”。

您可以尝试将模块编译为汇编代码并查看它以查找哪个函数使用__floatsidf

请记住,double的使用可能位于头文件中,可能是其他人编写的。