2013-06-21 8 views
5

Kompiliert ich eine ladbare Kernel-Modul zu schreiben und wenn es zu kompilieren versuchen, schlägt der Linker mit der folgenden Meldung:„__floatsidf“ undefiniert Warnung, wenn Kernel-Modul

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

ich verwende NICHT Punktvariablen schwimmen, so das ist es nicht. Was ist die Ursache solcher Fehler?

Hinweis: Ich verwende Linux ubuntu kernel v. 3.5.0-23-generic

+0

Fügen Sie etwas ein, das möglicherweise einen Verweis auf das Symbol "__floatsidf" enthält? –

+0

Beide Antworten kommen auf diese - verwenden Sie nicht Fließkomma im Kernel. – ugoren

Antwort

7

__floatsidf ist eine Laufzeitroutine zum Konvertieren einer 32-Bit-Ganzzahl mit Vorzeichen in eine Gleitkommazahl mit doppelter Genauigkeit. Irgendwo in Ihrem Projekt ist eine Linie, die wie folgt aussieht:

double foo = bar; 

oder etwas ähnliches, wo bar ist ein 32-Bit-Integer. Es könnte auch sein, dass Sie eine der libm Funktionen sind telefonisch unter (oder jeder anderen Funktion, wirklich), die ein double mit einem Integer-Parameter erwartet:

foo = pow(bar, baz); 

wo entweder bar oder baz (oder beide) eine ganzen Zahl .

Ohne etwas Code anzuzeigen, können wir nicht viel mehr tun, um zu helfen.

es verengen, überprüfen Sie die Objektdateien Compiler erzeugt (bevor Sie sie verknüpfen) und für einen Verweis auf das entsprechende Symbol in der Demontage finden -, dass Sie sollten sagen, was in es funktioniert passiert

Hier ein. Beispiel dessen, was ich meine. Zuerst - Quellcode:

#include <math.h> 

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

Ziemlich einfach, oder? Nun, ich werde es für ARM kompilieren und zu demontieren:

$ 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 

Blick auf das - zwei Anrufe __floatsidf und ein bis __fixdfsi, passend zu den beiden Umwandlungen von x und y-double und dann die Umwandlung der Rückgabetyp zurück zu int.

4

Sie verwenden irgendwo Floating-Point - Ihr Modul beinhaltet eine Umwandlung von int zu double. Es könnte so einfach sein wie das Aufrufen einer Funktion, die einen double Parameter annimmt und eine int übergibt.

Sie könnten versuchen, Ihren Code für "double" zu suchen.

Sie könnten versuchen, Ihr Modul mit dem Assemblercode zu kompilieren und sich das anzuschauen, um herauszufinden, welche Funktion __floatsidf verwendet.

Denken Sie daran, dass die Verwendung von double möglicherweise in einer Headerdatei enthalten ist, die möglicherweise von jemand anderem geschrieben wurde.

Verwandte Themen