ระบบปฏิบัติการคือ Ubuntu 20.10
แหล่งที่มาของเคอร์เนลคือ linux_5.8.0-59.66
ฉันกำลังย้ายการปรับเปลี่ยนเคอร์เนลจาก Centos 7 Rhel 7.9 ไปยัง Ubuntu
แหล่งที่มาของเคอร์เนล Ubuntu ดั้งเดิมที่ไม่ได้แก้ไขจะคอมไพล์และทำงานอย่างสมบูรณ์บนเครื่องนี้ ดูเหมือนว่าการตั้งค่าคอมไพเลอร์จะทำงานอย่างถูกต้อง
ปัญหาปัจจุบันของฉันเกี่ยวข้องกับการเรียกระบบที่ฉันเพิ่มเข้าไป ข้อผิดพลาดที่เกิดขึ้นคือ -
LD .tmp_vmlinux.btf
ld: arch/x86/entry/syscall_64.o:(.rodata+0xdc0): การอ้างอิงที่ไม่ได้กำหนดถึง `__x64_sys_s_enable'
BTF .btf.vmlinux.bin.o
ข้อผิดพลาดการแบ่งส่วน (คอร์ดัมพ์)
LD .tmp_vmlinux.kallsyms1
.btf.vmlinux.bin.o: ไม่รู้จักไฟล์: ไม่รู้จักรูปแบบไฟล์
ทำ: *** [Makefile:1163: vmlinux] ข้อผิดพลาด 1
ฉันได้ค้นหาและ googled ข้อผิดพลาดดั้งเดิมนี้ "การอ้างอิงที่ไม่ได้กำหนด" พบการแก้ไขที่เป็นไปได้ซึ่งไม่ได้ผล
ต่อไปนี้เป็นขั้นตอนที่ฉันใช้เพื่อเพิ่มการเรียกระบบ ซึ่งแต่เดิมใช้งานได้กับ Centos 7 และ RHEL 7.9
แก้ไข /SOURCE-DIRECTORY/include/linux/syscalls.h แสดงความคิดเห็นในบรรทัดเดิมและเพิ่มการอ้างอิงถึง __64 (รวมถึงบรรทัดว่างด้านบน)-
asmlinkage ยาว __64_sys_s_enable(int s_enable_flag);
// asmlinkage ยาว sys_s_enable (int s_enable_flag);
แก้ไข /SOURCE-DIRECTORY/arch/x86/include/asm/syscalls.h เพิ่ม -
# การเพิ่ม SYSCALL
440 64 s_enable sys_s_enable
ฟิลด์นี้ถูกคั่นด้วย TAB และฉันไม่ได้เพิ่มบรรทัดว่างใดๆ
สร้างไดเร็กทอรีต้นทางและไฟล์ -
/SOURCE-DIRECTORY/s_enable ที่มี s_enable.c
s_enable.c อย่างครบถ้วนคือ
#รวม <linux/kernel.h>
ภายนอก int s_enable_flag;
asmlinkage ยาว sys_s_enable (int i)
{
// printk(KERN_INFO "ใน SYSCALL ดั้งเดิม s_enable\n");
s_enable_flag = ฉัน;
กลับ 0;
}
และเพิ่มไดเร็กทอรี syscall ที่เหมาะสมให้กับ Makefile
core-y += เคอร์เนล/ certs/ mm/ fs/ ipc/ security/ crypto/ block/ s_enable/
และเรียกใช้ "sudo make"
ฉันไม่แน่ใจว่าฉันทำอะไรผิดที่ "make" ใช้งานได้กับแหล่งเคอร์เนลดั้งเดิมและการเรียกระบบที่ฉันพยายามเพิ่มนั้นใช้งานได้กับ distros อื่น ๆ ที่กล่าวถึง
ขอขอบคุณสำหรับการป้อนข้อมูลใด ๆ ที่คุณสามารถให้ได้