Bagaimana cara menghasilkan Module.symvers?

14

Saya baru-baru ini melalui Unpacking kernel-source rpm off-system (OpenSuse)? ; dan ketika butuh> 10 jam pada mesin saya, bayangkan keterkejutan saya setelah melakukan proses yang dijelaskan di sana, saya tidak menemukan Module.symverstempat!

Ketika saya mencari "menghasilkan Module.symvers", saya mendapatkan ini:

CATATAN: "modules_prepare" tidak akan membangun Module.symvers bahkan jika
CONFIG_MODVERSIONS diatur; oleh karena itu, build kernel penuh perlu
dijalankan untuk membuat versi modul berfungsi.
( Dokumentasi Kernel Linux :: kbuild: modules.txt )

... tapi saya tidak benar-benar mendapatkannya - bukankah kernel dibangun pada langkah sebelumnya (dijelaskan dalam tautan yang diberikan di atas? Saya yakin tahu butuh> 10 jam untuk CC untuk menghasilkan sejumlah besar * .o file, dan LD untuk menautkannya, jadi pasti ada sesuatu yang dibangun. Tetapi jika demikian, lalu di mana Module.symvers?

Dalam istilah yang lebih eksplisit, perintah apa yang harus saya panggil untuk menghasilkan Module.symvers? Saya tahu itu make preparetidak akan berhasil - tapi apa perintahnya?

sdaau
sumber
FYI, pada opensuse, Anda mungkin mendapatkan Module.symversoleh zypper install kernel-source, dan yang sejenis di linux distro lain. File ini terletak di lib/modules/xxx/build.
Syrtis Major

Jawaban:

16

Ini Module.symvers(kembali) dihasilkan ketika Anda (kembali) menyusun modul. Jalankan make modules, dan Anda harus mendapatkan Module.symversfile di root pohon kernel.

Perhatikan bahwa jika Anda hanya berlari makedan tidak make modules, Anda belum membangun modul apa pun. Simbol dari kernel itu sendiri ( vmlinuxatau salah satu format gambar yang bergantung pada arsitektur) ada di System.map.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Terima kasih banyak untuk itu, @Gilles - Sejak saat itu saya juga menemukan file Answer: Module.symvers ; dan dapat mengkonfirmasi bahwa make modulesmemang membuat Module.symvers. Terima kasih juga telah menjelaskan perbedaan antara makedan make modules, dan hubungan dengan System.map. Bersulang!
sdaau
Bagaimana jika "make" tidak tersedia di mesin?
bzupnick
3
@ bzupnick Instal. Itu salah satu alat yang diperlukan untuk membangun modul kernel Linux. Banyak perangkat lunak yang diperlukan untuk membuatnya.
Gilles 'SO- stop being evil'
Saya mencoba mengkompilasi silang LKM dari komputer lain. Menginstal hal-hal pada kotak pertama tidak mungkin.
bzupnick
@ bzupnick Anda harus tetap membuat untuk membangun modul. Itu semua terjadi pada mesin build, tidak ada yang bisa dilakukan pada mesin target kecuali untuk insmod.
Gilles 'SANGAT berhenti menjadi jahat'
3

untuk orang-orang yang menemukan pertanyaan ini dengan googling peringatan yang Anda dapatkan ketika menyusun salah satu LKM sampel Derek Molloy: Anda dapat membuatnya dengan kosong touch Modules.symvers. jika kernel Anda tidak menggunakan modifikasi (CRC yang digunakan oleh sistem operasi untuk membantu memastikan modul cocok dengan kernel) dan modul Anda tidak memiliki dependensi pada modul lain, ini akan cukup baik untuk menekan peringatan.

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

file kosong sama baiknya dengan yang dihasilkan oleh gcc, yang hanya memiliki simbol-simbol yang sama 0x00000000 CRC yang , pada sistem tanpa modifikasi.

jcomeau_ictx
sumber
1

Pada CentOS, dan mungkin varian RedHat lainnya, cukup ekstrak file yang sesuai untuk kernel Anda yang sedang berjalan:

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

Di Ubuntu dan mungkin varian Debian lainnya, berkasnya dapat ditemukan secara otomatis. Namun, jika Anda membutuhkannya, file ada di sini:

/usr/src/linux-headers-$(uname -r)/Module.symvers
Id2ndR
sumber
Saya tidak dapat menemukan linux-headers-$(uname -r)folder
King Stone