2012-02-29 25 views
8

Tôi có hai mô-đun hạt nhân (nói modA và modB). modA xuất khẩu một biểu tượng với EXPORT_SYMBOL(symA) và modB sử dụng nó. Tôi có tiêu đề modA.h cho Moda:Cảnh báo xây dựng mô-đun hạt nhân sử dụng các ký hiệu đã xuất

... 
extern void symA(int param); 
... 

và trong modB.c:

#include "modA.h" 
... 
static int __init modB_init(void) 
{ 
    symA(10); 
} 
... 

Nếu tôi insmod modB tất cả hoạt động tốt, modB tôi được liên kết một cách chính xác trong hạt nhân và các chức năng symA được gọi một cách chính xác. Tuy nhiên khi tôi xây dựng modB trình biên dịch tăng cảnh báo: symA is undefined. Một LKM là một ELF relocatable vậy tại sao trình biên dịch làm tăng cảnh báo này? Làm thế nào có thể được loại bỏ này?

Trả lời

12

Vấn đề này (và làm thế nào để biên dịch một cách chính xác trong trường hợp này) được giải thích trong http://www.kernel.org/doc/Documentation/kbuild/modules.txt

Đôi khi, một mô-đun bên ngoài sử dụng xuất khẩu ký tự từ một mô-đun bên ngoài . kbuild cần có kiến ​​thức đầy đủ về tất cả các ký hiệu để tránh phát tán cảnh báo về các ký hiệu không xác định. Ba giải pháp tồn tại cho tình huống này.

LƯU Ý: Phương pháp có tệp kbuild cấp cao nhất được khuyến nghị nhưng có thể là không thực tế trong một số trường hợp nhất định.

Sử dụng tệp kbuild cấp cao nhất Nếu bạn có hai mô-đun, foo.ko và bar.ko, trong đó foo.ko cần ký hiệu từ bar.ko, bạn có thể sử dụng một tệp kbuild chung cấp cao nhất các mô-đun được biên soạn trong cùng một cấu trúc . Xem xét bố cục thư mục sau:

./foo/ <= contains foo.ko  ./bar/ <= contains bar.ko 

    The top-level kbuild file would then look like: 

    #./Kbuild (or ./Makefile):   obj-y := foo/ bar/ 

    And executing 

     $ make -C $KDIR M=$PWD 

    will then do the expected and compile both modules with   full 

kiến ​​thức về các biểu tượng từ một trong hai mô-đun.

Sử dụng tệp Mô-đun bổ sung khi mô-đun bên ngoài được tạo, tệp Mô-đun được tạo ra chứa tất cả các ký hiệu đã xuất không được xác định trong hạt nhân. Để truy cập vào các biểu tượng từ bar.ko, hãy sao chép tệp Module.symvers từ việc biên soạn bar.ko vào thư mục nơi foo.ko được tạo. Trong quá trình xây dựng mô-đun, kbuild sẽ đọc tệp Module.symvers trong thư mục của mô-đun bên ngoài và khi xây dựng xong, tệp Module.symvers mới được tạo có chứa tổng tất cả các ký hiệu được xác định và không phải là một phần của hạt nhân.

Sử dụng "làm cho" KBUILD_EXTRA_SYMBOLS biến Nếu đó là không thực tế để Module.symvers sao chép từ mô-đun khác, bạn có thể gán một không gian tách ra danh sách các tập tin để KBUILD_EXTRA_SYMBOLS trong xây dựng tập tin của bạn. Các tệp này sẽ được tải bởi modpost trong khi khởi tạo các bảng biểu tượng của nó.

+0

Tuyệt vời! Tôi bỏ lỡ điều đó. Cảm ơn bạn Gossamer! – MirkoBanchi

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