2013-06-21 25 views
5

tôi đã viết một mô-đun hạt nhân có thể nạp được và khi cố gắng để biên dịch nó, mối liên kết không thành công với thông báo sau:"__floatsidf" cảnh báo không xác định khi biên dịch kernel module

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

Tôi KHÔNG sử dụng các biến dấu chấm động, vì vậy không phải vậy. Nguyên nhân của các lỗi như vậy là gì?

Lưu ý: Tôi đang sử dụng Linux ubuntu kernel v. 3.5.0-23-generic

+0

Bạn có bao gồm bất kỳ thứ gì có thể chứa tham chiếu đến biểu tượng '__floatsidf' không? –

+0

Cả hai câu trả lời đều đi xuống điều này - không sử dụng dấu chấm động trong hạt nhân. – ugoren

Trả lời

7

__floatsidf là một thường trình thời gian chạy để chuyển đổi số nguyên đã ký 32 bit thành số dấu chấm động chính xác gấp đôi. Một nơi nào đó trong dự án của bạn là một dòng trông giống như:

double foo = bar; 

Hoặc một cái gì đó tương tự, trong đó bar là số nguyên 32 bit. Nó cũng có thể là bạn đang gọi một trong những libm chức năng (hay bất kỳ chức năng khác, thực sự) mà hy vọng một double với một tham số nguyên:

foo = pow(bar, baz); 

nơi một trong hai bar hoặc baz (hoặc cả hai) là một số nguyên .

Không hiển thị một số mã, chúng tôi không thể làm gì nhiều hơn để trợ giúp.

Để thu hẹp nó xuống, kiểm tra các đối tượng tập tin trình biên dịch của bạn tạo ra (trước khi bạn liên kết chúng) và nhìn vào tháo gỡ cho một tham chiếu đến biểu tượng đó - rằng nên cho bạn biết chức năng nó đang xảy ra trong

Dưới đây là một. ví dụ về ý tôi. Mã nguồn đầu tiên:

#include <math.h> 

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

Khá đơn giản, đúng không? Bây giờ, tôi sẽ biên dịch nó cho ARM và tháo rời:

$ 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 

Nhìn vào đó - hai cuộc gọi đến __floatsidf và một để __fixdfsi, phù hợp với hai chuyển đổi của xy-double và sau đó chuyển đổi của trở về loại trở lại int.

4

Bạn đang sử dụng dấu chấm động ở đâu đó - mô-đun của bạn bao gồm một chuyển đổi từ int để double. Nó có thể đơn giản như gọi một hàm nhận tham số double và chuyển qua một số int.

Bạn có thể thử tìm kiếm mã "double".

Bạn có thể thử biên dịch mô-đun của mình thành mã assembly và nhìn vào đó để tìm hàm nào sử dụng __floatsidf.

Hãy nhớ rằng việc sử dụng double có thể nằm trong tệp tiêu đề, có thể do người khác viết.

Các vấn đề liên quan