2010-04-27 7 views
26

Tôi cố gắng chèn mô-đun cũ của hạt nhân Linux đang được tôi chuyển. Các lỗi sau xuất hiện:phiên bản mô-đun_layout không tương thích

> sudo insmod camac-mx.ko 
insmod: error inserting 'camac-mx.ko': -1 Invalid module format 
dmesg |tail -n 1 
[1312783.938299] camac_mx: disagrees about version of symbol module_layout 

Làm cách nào để khắc phục sự cố này?

Trả lời

26

Điều này cho biết bạn đã biên dịch mô-đun dựa trên phiên bản hạt nhân khác với đang chạy. Lưu ý rằng ngay cả khi hạt nhân đang chạy và nguồn nhân có cùng giá trị số (ví dụ: cả hai đều là 2.6.31-20-server), nếu hai sử dụng các tùy chọn cấu hình khác nhau, bạn có thể thấy lỗi này. Đồng thời kiểm tra xem có nhiều phiên bản của mô-đun này trên máy và đảm bảo bạn đang tải đúng mô-đun.

7

Để giải quyết điều đó (khó).

Trước tiên, bạn cần nguồn hạt nhân và tiêu đề.

Đến dir cơ sở hạt nhân của mình, đây /usr/src/linux-source-2.6.35

Kiểm tra uname -r, đây 2.6.35-27-generic

make -C /lib/modules/2.6.35-27-generic/build \ 
SUBDIRS=/usr/src/linux-source-2.6.35/drivers/net/wireless/ath/ath5k modules 

/lib/modules/2.6.35-27-generic/build -> /usr/src/linux-headers-2.6.35-27-generic

Kiểm tra sự phụ thuộc mô-đun với modinfo hoặc lsmod và tải chúng trong một kịch bản:

modprobe -r ath5k 
modprobe cfg80211 
modprobe led_class 
modprobe mac80211 
modprobe ath 
insmod /usr/src/linux-source-2.6.35/drivers/net/wireless/ath/ath5k/ath5k.ko 

Với phương pháp này, vermagic cũng có thể là khác nhau .... các make modules_install là vô dụng, nhưng có lẽ vì module có mặt trong 2 nơi khác nhau (/ lib/modules/extra và .../kernel/drivers), không được thay thế ...

modinfo -F vermagic /usr/src/linux-source-2.6.35/drivers/net/wireless/ath /ath5k/ath5k.ko

Tôi không thực sự hiểu tại sao nó khó khăn như vậy trong ubuntu 10.10 để sửa lỗi/gỡ lỗi mô-đun: (

1

Giải pháp nhanh và làm việc được tìm thấy here.

Chỉ cần sử dụng modules/build thư mục trong số makefile, NOT /usr/src/linux-source.

make -C /lib/modules/`uname -r`/build ... 
12

Đối với những người làm việc trên hệ thống mà không cần truy cập vào kernel, kernel-config hoặc ksyms, nếu bạn có một working.ko và xây dựng, không làm việc của bạn, broken.ko.

Rất có thể nó sẽ không tải, nhưng nếu bạn đủ tuyệt vọng để thử;

# modprobe --dump-modversions working.ko 
0x0b11e775  module_layout 
# modprobe --dump-modversions broken.ko 
0x2719d41e  module_layout 

Sau đó sử dụng trình soạn thảo hex mà bạn yêu thích, thay đổi nó để phù hợp:

00016c70 75 e7 11 0b 6d 6f 64 75 6c 65 5f 6c 61 79 6f 75 |u...module_layou| 

(Giá trị là ngược lại do đặt hàng endian) Sẽ rất có thể là một bó toàn bộ bạn phải khớp nhau.Ai đó có thể viết kịch bản perl để làm điều này ....

+0

nhưng tôi không thể tìm thấy module_layout, chỉ cần rất nhiều le_layout. – netawater

+0

@netawater, tôi nghĩ những gì bạn thấy giống như thế này: "0x75646f6dda9e78e9 le_layout". Những gì bạn cần thay đổi là các số sau "75646f6d" là nội dung thập lục phân được đảo ngược của "modu". – wangqi060934

0

Tôi có hệ thống android với một mô-đun nhị phân (pvrsrvkm dành cho đồ họa). Tôi đã xây dựng hạt nhân từ nguồn cho hệ thống này. Nói chung tất cả các công trình tốt, nhưng với một số tùy chọn .config kernel (cho kgdb), mô-đun pvrsrvkm sẽ không tải với "không đồng ý về phiên bản của biểu tượng" lỗi.

Mô-đun pvrsrvkm được tải sớm từ Android và khi hệ thống không hoạt động được thì không sử dụng được GUI.

Kể từ khi tôi đã được xây dựng hạt nhân, sửa chữa nhanh chóng của tôi là để vô hiệu hóa phiên bản kiểm tra bằng cách thêm một dòng (versindex = 0;) tới kernel file nguồn kernel/module.c:

static int check_version(Elf_Shdr *sechdrs, 
unsigned int versindex, 
const char *symname, 
struct module *mod, 
const unsigned long *crc, 
const struct module *crc_owner) 
{ 
unsigned int i, num_versions; 
struct modversion_info *versions; 

/* Exporting module didn't supply crcs? OK, we're already tainted. */ 
if (!crc) 
    return 1; 

/* No versions at all? modprobe --force does this. */ 
versindex = 0; // I added this line 
if (versindex == 0) 
    return try_to_force_load(mod, symname) == 0; 
0

Trước khi vào nguồn của bạn kernel

làm sạch ARCH = tay CROSS_COMPILE = cánh tay-linux-gnueabi-

chỉnh sửa các tập tin trong kernel source: Module.symvers thay đổi "Module_layout" với làm việc, bạn có thể tìm kiếm tập tin này trên thiết bị của bạn

.210

biên dịch tài xế dụ: làm C ~/nguồn kernel ARCH = tay CROSS_COMPILE = cánh tay-linux-gnueabihf- DIR =/nguồn kernel M =/modules/example module

Kiểm tra module_layout trong bạn XXX. ko với: sudo modprobe --dump-modversions XXX.ko

NB