2013-06-21 11 views
5

pisałem ładowalny moduł jądra i gdy próbuje go skompilować, łącznik nie powiedzie się z następującym komunikatem:„__floatsidf” niezdefiniowany ostrzeżenie przy kompilacji modułu jądra

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

nie używam pływających zmiennych punkt, więc To nie to. Jaka jest przyczyna takich błędów?

Uwaga: Używam Linux ubuntu kernel v. 3.5.0-23-generic

+0

Czy zawierasz wszystko, co może zawierać odniesienie do symbolu '__floatsidf'? –

+0

Obie odpowiedzi sprowadzają się do tego - nie używaj zmiennoprzecinkowego w jądrze. – ugoren

Odpowiedz

7

__floatsidf to procedura wykonawcza do konwersji 32-bitowej liczby całkowitej ze znakiem w liczbę zmiennoprzecinkową podwójnej precyzji. Gdzieś w projekcie jest linia, która wygląda następująco:

double foo = bar; 

lub coś podobnego, gdzie bar jest 32-bitową liczbą całkowitą. Może to być również, że dzwonisz jedną z libm funkcji (lub jakiejkolwiek innej funkcji, naprawdę), że spodziewa się double z parametrem integer:

foo = pow(bar, baz); 

gdzie albo bar lub baz (lub oba) jest liczbą całkowitą .

Nie pokazując kodu, niewiele możemy zrobić, aby Ci pomóc.

Aby sprowadzić sprawdzić obiekt plikami kompilator generuje (zanim je połączyć) i spojrzeć w demontażu dla odniesienia do tego symbolu - że powinien powiedzieć, co działać to się dzieje w

Oto. przykład tego, co mam na myśli. Najpierw - kod źródłowy:

#include <math.h> 

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

Całkiem proste, prawda? Teraz mam zamiar skompilować go za ramię i demontować:

$ 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 

Spójrz na to - dwa połączenia do __floatsidf i jeden do __fixdfsi, spełniające dwie konwersje o x i y do double a następnie konwersja typ zwrotu z powrotem do int.

4

Używasz zmiennoprzecinkowych gdzieś - Twój moduł obejmuje konwersję z int do double. Może to być tak proste, jak wywołanie funkcji, która przyjmuje parametr double i przekazanie int.

Możesz spróbować przeszukać swój kod pod kątem "podwójnego".

Możesz spróbować skompilować swój moduł do kodu zespołu i patrząc na to, aby znaleźć funkcję, która używa __floatsidf.

Pamiętaj, że użycie double może znajdować się w pliku nagłówkowym, prawdopodobnie w innym, napisanym przez kogoś innego.

Powiązane problemy