Làm cách nào để tạo Module.symvers?


14

Gần đây tôi đã trải qua Unpacking hệ thống tắt vòng / phút nguồn kernel (OpenSuse)? ; và khi nó mất> 10 giờ trên máy của tôi, hãy tưởng tượng sự ngạc nhiên của tôi rằng sau khi thực hiện quy trình được mô tả ở đó, tôi không tìm thấy Module.symversbất cứ nơi nào!

Khi tôi tìm kiếm "tạo Module.symvers", tôi nhận được điều này:

LƯU Ý: "Module_prepare" sẽ không xây dựng Module.symvers ngay cả khi
CONFIG_MODVERSIONS được đặt; do đó, một bản dựng kernel đầy đủ cần được
thực thi để làm cho phiên bản mô-đun hoạt động.
( Tài liệu hạt nhân Linux :: kbuild: Module.txt )

... nhưng tôi không thực sự hiểu nó - không phải kernel đã được xây dựng ở bước trước (được mô tả trong liên kết đã cho ở trên sao? Tôi chắc chắn biết rằng phải mất 10 giờ để CC tạo ra cả đống * .o các tập tin và LD để liên kết chúng, vì vậy một cái gì đó phải được xây dựng. Nhưng nếu vậy, thì ở đâu Module.symvers?

Nói một cách rõ ràng hơn, chính xác tôi nên gọi lệnh nào để tạo Module.symvers? Tôi biết rằng nó make preparesẽ không hoạt động - nhưng lệnh đó sẽ là gì?


FYI, trên opensuse, bạn có thể nhận được Module.symversbằng cách zypper install kernel-source, và tương tự trên distro Linux khác. Các tập tin được đặt trong lib/modules/xxx/build.
Syrtis Major

Câu trả lời:


16

Module.symvers(tái) được tạo khi bạn (biên dịch lại) các mô-đun. Chạy make modulesvà bạn sẽ nhận được một Module.symverstập tin ở thư mục gốc của cây kernel.

Lưu ý rằng nếu bạn chỉ chạy makevà không chạy make modules, bạn chưa xây dựng bất kỳ mô-đun nào. Các ký hiệu từ chính kernel ( vmlinuxhoặc một trong các định dạng hình ảnh phụ thuộc vào kiến ​​trúc) nằm trong System.map.


Rất cám ơn về điều đó, @Gilles - Tôi cũng đã tìm thấy Trả lời: tệp Module.symvers ; và có thể xác nhận rằng make modulesthực sự tạo ra Module.symvers. Cũng cảm ơn vì đã làm rõ sự khác biệt giữa makemake modules, và mối quan hệ với System.map. Chúc mừng!
sdaau

Điều gì xảy ra nếu "make" không có sẵn trên máy?
bzupnick

2
@bzupnick Cài đặt nó. Đây là một trong những công cụ cần thiết để xây dựng các mô-đun hạt nhân Linux. Rất nhiều phần mềm yêu cầu thực hiện để xây dựng.
Gilles 'SO- ngừng trở nên xấu xa'

Tôi đang cố gắng biên dịch chéo một LKM từ một máy khác. Cài đặt mọi thứ trên hộp đầu tiên là không thể.
bzupnick

@bzupnick Bạn cần phải thực hiện để xây dựng mô-đun nào. Tất cả đều xảy ra trên máy dựng, không có gì để làm trên máy đích ngoại trừ insmod.
Gilles 'SO- ngừng trở nên xấu xa'

3

đối với những người tìm thấy câu hỏi này bằng cách googling cảnh báo bạn nhận được khi biên dịch một trong các LKM mẫu của Derek Molloy: bạn có thể chỉ cần tạo một câu hỏi trống touch Modules.symvers. nếu kernel của bạn không sử dụng các biến đổi (CRC được sử dụng bởi hệ điều hành để giúp đảm bảo các mô-đun khớp với kernel) và mô-đun của bạn không có bất kỳ sự phụ thuộc nào vào các mô-đun khác, điều này sẽ đủ tốt để chặn cảnh báo.

WARNING: Symbol version dump ./Module.symvers
         is missing; modules will have no dependencies and modversions.

tệp trống cũng tốt như tệp được tạo bởi gcc, tệp này chỉ có tất cả các ký hiệu có cùng 0x00000000giá trị CRC, trên một hệ thống không có sửa đổi.


1

Trên CentOS và có thể các biến thể RedHat khác, chỉ cần giải nén tệp tương ứng cho kernel đang chạy của bạn:

zcat /boot/symvers-$(uname -r).gz > ./Module.symvers

Trên Ubuntu và có thể các biến thể Debian khác, các đường dẫn tệp sẽ được tìm thấy tự động. Tuy nhiên, nếu bạn cần nó, tập tin ở đây:

/usr/src/linux-headers-$(uname -r)/Module.symvers

Tôi không thể tìm thấy linux-headers-$(uname -r)thư mục
King Stone
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.