วิธีการสร้าง Module.symvers


14

เมื่อเร็ว ๆ นี้ฉันได้เปิด RPM นอกเคอร์เนลซอร์ส (OpenSuse) หรือไม่ ; และในขณะที่ใช้เวลา> 10 ชั่วโมงบนเครื่องของฉันลองจินตนาการถึงความประหลาดใจของฉันว่าหลังจากทำตามขั้นตอนที่อธิบายไว้ที่นั่นฉันไม่พบModule.symversที่ใดเลย!

เมื่อฉันค้นหา "generate Module.symvers" ฉันจะได้รับสิ่งนี้:

หมายเหตุ: "modules_prepare" จะไม่สร้าง Module.symvers แม้ว่า
CONFIG_MODVERSIONS จะถูกตั้งค่าไว้ ดังนั้นการสร้างเคอร์เนลแบบเต็มจะต้อง
ดำเนินการเพื่อให้การกำหนดรุ่นโมดูลทำงานได้
( เอกสารเคอร์เนล Linux :: kbuild: modules.txt )

... แต่ฉันไม่เข้าใจ - เคอร์เนลไม่ได้ถูกสร้างขึ้นในขั้นตอนก่อนหน้า (อธิบายไว้ในลิงก์ด้านบนใช่หรือไม่ฉันแน่ใจว่าใช้เวลา> 10 ชั่วโมงสำหรับ CC เพื่อสร้างกลุ่มทั้งหมด * .o ไฟล์และ LD เพื่อเชื่อมโยงพวกเขาดังนั้นสิ่งที่จะต้องสร้างขึ้น แต่ถ้าเป็นเช่นนั้นแล้วจะอยู่Module.symversที่ไหน?

ในแง่ที่ชัดเจนมากขึ้นฉันควรเรียกใช้คำสั่งอะไรเพื่อสร้าง Module.symvers ฉันรู้ว่ามันmake prepareจะไม่ทำงาน - แต่อะไรคือคำสั่งที่จะ?


FYI ใน openSUSE คุณอาจได้รับModule.symversโดยzypper install kernel-sourceและที่คล้ายกันใน distro ลินุกซ์อื่น ๆ lib/modules/xxx/buildไฟล์ที่อยู่ใน
Syrtis Major

คำตอบ:


16

สร้างModule.symversis (อีกครั้ง) เมื่อคุณ (อีกครั้ง) รวบรวมโมดูล เรียกใช้make modulesและคุณควรได้รับModule.symversไฟล์ที่รูทของเคอร์เนลทรี

โปรดทราบว่าหากคุณรัน แต่makeไม่ใช่make modulesคุณยังไม่ได้สร้างโมดูลใด ๆ สัญลักษณ์จากเมล็ดของตัวเอง ( vmlinuxหรือหนึ่งของสถาปัตยกรรมขึ้นอยู่กับรูปแบบภาพ) System.mapอยู่ใน


ขอบคุณมากสำหรับสิ่งนั้น @Gilles - ฉันก็ได้พบคำตอบ: ไฟล์ Module.symvers ; และสามารถยืนยันได้ว่าไม่แน่นอนสร้างmake modules Module.symversขอขอบคุณสำหรับคำชี้แจงความแตกต่างระหว่างmakeและและความสัมพันธ์กับmake modules System.mapไชโย!
sdaau

เกิดอะไรขึ้นถ้า "ทำ" ไม่สามารถใช้งานได้ในเครื่อง?
bzupnick

3
@bzupnick ติดตั้ง เป็นหนึ่งในเครื่องมือที่จำเป็นในการสร้างโมดูลเคอร์เนล Linux ซอฟต์แวร์จำนวนมากต้องการสร้าง
Gilles 'หยุดชั่วร้าย'

ฉันพยายามรวบรวม LKM จากเครื่องอื่น การติดตั้งสิ่งต่าง ๆ ในกล่องแรกเป็นไปไม่ได้
bzupnick

@bzupnick คุณต้องสร้างเพื่อสร้างโมดูลต่อไป insmodมันคือทั้งหมดที่เกิดขึ้นในการสร้างเครื่องที่มีอะไรที่ต้องทำบนเครื่องเป้าหมายยกเว้น
Gilles 'หยุดชั่วร้าย'

4

สำหรับผู้ที่พบคำถามนี้โดย googling เตือนที่คุณได้รับเมื่อรวบรวมหนึ่ง LKMs ตัวอย่างดีเร็กคีร์กีซของ: touch Modules.symversคุณก็สามารถทำให้เป็นหนึ่งที่ว่างเปล่ากับ หากเคอร์เนลของคุณไม่ได้ใช้ตัวดัดแปลง (CRCs ที่ใช้โดยระบบปฏิบัติการเพื่อช่วยให้มั่นใจว่าโมดูลตรงกับเคอร์เนล) และโมดูลของคุณไม่มีการพึ่งพาโมดูลอื่น ๆ นี่จะดีพอที่จะยับยั้งคำเตือน

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

ไฟล์ว่างนั้นดีเท่ากับไฟล์ที่สร้างโดย gcc ซึ่งมีสัญลักษณ์ทั้งหมดที่มี0x00000000ค่า CRC เดียวกันบนระบบที่ไม่มีตัวแปลง


1

บน CentOS และตัวแปร RedHat อื่น ๆ เพียงแยกไฟล์ที่เกี่ยวข้องสำหรับเคอร์เนลที่ใช้งานอยู่:

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

บน Ubuntu และตัวแปร Debian อื่น ๆ ไฟล์จะถูกตรวจพบโดยอัตโนมัติ อย่างไรก็ตามหากคุณต้องการไฟล์อยู่ที่นี่:

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

ฉันไม่พบlinux-headers-$(uname -r)โฟลเดอร์
King Stone
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.