2013-06-21 7 views
5

をコンパイルするときに私はローダブルカーネルモジュールを書いていたし、それをコンパイルしようとしたとき、リンカは以下のメッセージで失敗します。「__floatsidf」未定義の警告カーネルモジュール

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

私は、浮動小数点変数を使用していませんそれではない。このようなエラーの原因は何ですか?

注: - あなたのモジュールは、intからdoubleへの変換を含んでいる私は、あなたはどこか浮動小数点を使用しているLinux ubuntu kernel v. 3.5.0-23-generic

+0

あなたは '__floatsidf'シンボルへの参照を含むものを含めていますか? –

+0

どちらの答えもこれになります。カーネルで浮動小数点を使用しないでください。 – ugoren

答えて

7

__floatsidfは、32ビット符号付き整数を倍精度浮動小数点数に変換するランタイムルーチンです。 barは、32ビットの整数である同様の

double foo = bar; 

か何か、:プロジェクト内のどこかには、次のような行です。また、(実際に、または他の関数)あなたは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 

ルック - 2つのdoublexyの2つの変換を一致__fixdfsiから__floatsidfと1の呼び出し、その後の変換を戻り値の型はintに戻ります。

4

を使用しています。 doubleパラメーターをとり、intを渡す関数を呼び出すのと同じくらい簡単かもしれません。

"double"のコードを検索してみることもできます。

あなたのモジュールをアセンブリコードにコンパイルし、それを見てどの機能が__floatsidfを使用しているのかを調べることができます。

doubleの使用は、おそらく他の人が書いたヘッダーファイルにある可能性があることに注意してください。

関連する問題