2013-06-21 51 views
5

我正在寫一個可加載的內核模塊時,並試圖對其進行編譯時,鏈接器失敗,出現以下消息:「__floatsidf」未定義警告編譯內核模塊

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

我不使用浮點變量,因此,不是這個。這種錯誤的原因是什麼?

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

+0

您是否包含任何可能包含對__floatsidf符號的引用? –

+0

這兩個答案都歸結於此 - 不要在內核中使用浮點。 – ugoren

回答

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,匹配的x兩個轉換和ydouble後的轉換返回類型返回到int

4

您在某處使用浮點 - 你的模塊包括從intdouble轉換。這可能與調用一個參數爲double並傳遞int的函數一樣簡單。

您可以嘗試搜索「double」代碼。

你可以嘗試編譯你的模塊到彙編代碼,並看着那個找到哪個函數使用__floatsidf

請記住,使用double可能位於頭文件中,可能是其他人編寫的頭文件。