我正在寫一個可加載的內核模塊時,並試圖對其進行編譯時,鏈接器失敗,出現以下消息:「__floatsidf」未定義警告編譯內核模塊
*** Warning: "__floatsidf" [/testing/Something.ko] undefined!
我不使用浮點變量,因此,不是這個。這種錯誤的原因是什麼?
注:我使用Linux ubuntu kernel v. 3.5.0-23-generic
我正在寫一個可加載的內核模塊時,並試圖對其進行編譯時,鏈接器失敗,出現以下消息:「__floatsidf」未定義警告編譯內核模塊
*** Warning: "__floatsidf" [/testing/Something.ko] undefined!
我不使用浮點變量,因此,不是這個。這種錯誤的原因是什麼?
注:我使用Linux ubuntu kernel v. 3.5.0-23-generic
__floatsidf
是將32位有符號整數轉換爲雙精度浮點數的運行時例程。在某處你的項目是一條線,看起來像:
double foo = bar;
或者類似的東西,哪裏bar
是一個32位整數。它也可能是你正在調用的libm
功能之一(或任何其他的功能,真的)期望一個double
一個整數參數:
foo = pow(bar, baz);
情形之一bar
或baz
(或兩者)是一個整數。
沒有顯示一些代碼,我們可以做的不多。
爲了縮小範圍,檢查的目標文件的編譯器生成(您鏈接它們之前),並期待在拆裝到該符號的引用 - 這應該告訴你什麼樣的功能,它的發生在
這裏有一個。我的意思是例子。首先 - 源代碼:
#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
兩個轉換和y
到double
後的轉換返回類型返回到int
。
您在某處使用浮點 - 你的模塊包括從int
到double
轉換。這可能與調用一個參數爲double
並傳遞int
的函數一樣簡單。
您可以嘗試搜索「double」代碼。
你可以嘗試編譯你的模塊到彙編代碼,並看着那個找到哪個函數使用__floatsidf
。
請記住,使用double
可能位於頭文件中,可能是其他人編寫的頭文件。
您是否包含任何可能包含對__floatsidf符號的引用? –
這兩個答案都歸結於此 - 不要在內核中使用浮點。 – ugoren