Phiên bản không có ký hiệu nào cho module_layout 'khi thử tải usbhid.ko


27

Tôi đang cố gắng xây dựng mô-đun của riêng mình usbhid.ko, nhưng sau khi biên dịch, tôi không thể tải mô-đun. dmesgnói no symbol version for module_layout. Tôi đang tự hỏi vấn đề là gì? Tôi đã sử dụng nguồn kernel do Ubuntu cung cấp và tôi cũng đảm bảo rằng phiên bản kernel giống nhau.

Câu trả lời:


22

Cụ thể vấn đề là khi bạn xây dựng mô-đun của mình, cây nguồn kernel có thể đã thiếu tệp Modules.symvers. Hệ thống kbuild thực sự cảnh báo bạn về điều này khi bạn xây dựng mô-đun của mình. Nếu Modules.symvers bị thiếu, bạn sẽ thấy:

Cảnh báo: Phiên bản biểu tượng dump /usr/src/linux-2.6.34-12/Modules.symvers bị thiếu; mô-đun sẽ không có phụ thuộc và sửa đổi.

Nếu kernel của bạn đã CONFIG_MODVERSIONSđược bật, thì trong giai đoạn modpost xây dựng trình điều khiển của bạn, nó sẽ chạy scripts / mod / modpost với tùy chọn -m. Nếu bạn dũng cảm và xem nguồn script / mod / modpost.c , bạn sẽ thấy tùy chọn -m thêm biểu tượng _module_layout_ từ vmlinux, tuy nhiên nếu bạn không có Modules.symvers từ kernel, bạn sẽ không nhận được giá trị CRC cho biểu tượng này và bạn sẽ nhận được thông báo lỗi này.

Vì vậy, có hai cách xung quanh này.

1) chạy bản dựng đầy đủ của hạt nhân đang chạy của bạn để tạo Modules.symvers, sau đó xây dựng lại mô-đun của bạn. [http://www.mjmwired.net/kernel/Documentation/kbuild/modules.txt[[1]

51  === 2. How to Build External Modules
52  
53  To build external modules, you must have a prebuilt kernel available
54  that contains the configuration and header files used in the build.
55  Also, the kernel must have been built with modules enabled. If you are
56  using a distribution kernel, there will be a package for the kernel you
57  are running provided by your distribution.
58  
59  An alternative is to use the "make" target "modules_prepare." This will
60  make sure the kernel contains the information required. The target
61  exists solely as a simple way to prepare a kernel source tree for
62  building external modules.
63  
64  NOTE: "modules_prepare" will not build Module.symvers even if
65  CONFIG_MODVERSIONS is set; therefore, a full kernel build needs to be
66  executed to make module versioning work.

2) Tùy chọn khác là yêu cầu modprobe ngu ngốc bỏ qua tất cả những thứ nhảm nhí đó và chỉ cần tải mô-đun của bạn bằng mọi cách:

modprobe -f <module>

Tôi có xu hướng ủng hộ lựa chọn 2 :)


1
+1 cho "nói với modprobe ngu ngốc chỉ cần bỏ qua tất cả những điều tào lao đó và chỉ cần tải mô-đun của bạn bằng mọi cách".
Hayri Uğur Koltuk

Tôi đã thử 2 và thấy rằng mô-đun sẽ không tự động tải khi khởi động. Có cách nào để -f lúc khởi động không?
Justin Zhang

17

Có cả gói linux-headerslinux-sourcegói tương ứng với kernel của bạn được cài đặt. Ví dụ cho kernel 3.2.0-27-generic-paebạn cần:

  1. linux-headers-3.2.0-27-generic-pae
  2. linux-source-3.2.0-27-generic-pae.

Trong trường hợp phiên bản cho các gói ở trên không khớp với phiên bản kernel đang chạy của bạn thì bạn cần thay thế $(uname -r)bằng chuỗi phiên bản từ gói kernel đã cài đặt ở trên.
Đối với ví dụ trên phiên bản gói là 3.2.0-27-generic-pae. Khi bạn chạy uname -rvà đầu ra của nó là một cái gì đó khác nhau thì 3.2.0-27-generic-paebạn cần thay thế từng $(uname -r)bên dưới để khớp chuỗi phiên bản từ các gói đã cài đặt.

  1. cd /usr/src/linux-source-$Version và giải nén tệp lưu trữ .tar.bz2 tại chỗ và cd vào thư mục giải nén - Tôi đoán bạn đã làm điều này
  2. cp /boot/config-$(uname -r) .config vào thư mục nguồn kernel
  3. cp /usr/src/linux-headers-$(uname -r)/Module.symvers . vào thư mục nguồn kernel

Sau khi bạn đã làm điều đó, trong thư mục nguồn kernel, hãy làm điều này:

  1. make prepare
  2. make scripts
  3. make M=drivers/usb/serial- thay đổi đường dẫn sau M=cho phù hợp với nhu cầu của bạn

Thật không may, tôi không biết làm thế nào để xây dựng một mô-đun cụ thể trong khi Module.symverskhông bị ảnh hưởng. Làm make drivers/usb/serial/option.ko, ví dụ, giết chết Module.symverstập tin, và bạn kết thúc với vấn đề ban đầu của bạn. Sử dụng M=tham số không giết được nó, nhưng bạn phải xây dựng tất cả các mô-đun trong đường dẫn đã chỉ định - và tôi chưa tìm thấy cách nào xung quanh nó.


Đây có vẻ là cách tốt nhất để làm mọi thứ, trong trường hợp bạn biên dịch mô-đun trong cùng một phiên bản cây ...
Treviño

2

Bạn phải sử dụng cấu hình kernel giống hệt chính xác trước khi chạy make prepare. Ngoài ra, nếu bạn đang xây dựng nó ngoài cây, bạn cần xây dựng nó dựa trên các tiêu đề kernel giống hệt chính xác phù hợp với kernel hiện đang chạy của bạn (hoặc mục tiêu nếu bạn không chạy nó tại thời điểm biên dịch).


"make mrproper", "cp / boot / config - $ (uname -r) .config", "make oldconfig", "make ready", "make scripts" Tôi đã sử dụng các hướng dẫn này để chuẩn bị biên dịch. Tôi muốn biết nếu tôi đã sao chép tập tin cấu hình chính xác? có vẻ như chỉ có một cấu hình phù hợp với phiên bản kernel của tôi trong / boot /. xin lỗi về định dạng vì hộp bình luận không có định dạng ....
SpecC

Vâng, điều đó có vẻ đúng. Bạn đang gọi bản dựng ở đâu và nếu không phải từ thư mục toplevel, bạn đang vượt qua giá trị SUBDIRS nào?
Daniel T Chen

Cảm ơn vi đa trả lơi. khi tôi cố gắng xây dựng usbhid.ko. Tôi đã sử dụng lệnh này "tạo các mô-đun SUBDIRS = trình điều khiển / hid / usbhid"
SpecC

Khi tôi chạy lệnh "tạo mô-đun SUBDIRS = trình điều khiển / hid / usbhid", tôi nhận được cảnh báo sau "CẢNH BÁO: Phiên bản biểu tượng dump /usr/src/linux-source-2.6.31/Module.symvers bị thiếu; không phụ thuộc và thay đổi. "
SpecC

@SpecC Khi bạn điều tra vấn đề của mình, hãy cập nhật câu hỏi ban đầu của bạn với các bước bạn đang thực hiện. Sau đó, Dan sẽ cập nhật câu trả lời của anh ấy và bạn sẽ tiếp tục cập nhật cho đến khi bạn tìm ra nó thay vì một chuỗi các bình luận cuối cùng bị chôn vùi, xem hướng dẫn để biết thêm mẹo: meta.askubfox.com/questions/257/how-does-ask -với Ubuntu-công việc
Jorge Castro
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.