Hệ điều hành là Ubuntu 20.10
Nguồn hạt nhân là linux_5.8.0-59.66
Tôi đang chuyển các sửa đổi kernel từ Centos 7 Rhel 7.9 sang Ubuntu.
Nguồn nhân Ubuntu chưa sửa đổi ban đầu sẽ biên dịch và chạy hoàn toàn trên máy này. Trình biên dịch được thiết lập dường như đang hoạt động bình thường.
Sự cố hiện tại của tôi liên quan đến cuộc gọi hệ thống mà tôi đã thêm. Lỗi được tạo ra là -
LD .tmp_vmlinux.btf
ld: arch/x86/entry/syscall_64.o:(.rodata+0xdc0): tham chiếu không xác định tới `__x64_sys_s_enable'
BTF .btf.vmlinux.bin.o
Lỗi phân đoạn (đổ lõi)
LD .tmp_vmlinux.kallsyms1
.btf.vmlinux.bin.o: tệp không được nhận dạng: định dạng tệp không được nhận dạng
thực hiện: *** [Makefile:1163: vmlinux] Lỗi 1
Tôi đã tìm kiếm và googled lỗi ban đầu này "tham chiếu không xác định", đã tìm thấy các bản sửa lỗi có thể không hoạt động.
Dưới đây là các bước tôi đã sử dụng để thêm lệnh gọi hệ thống, vốn hoạt động ban đầu trên Centos 7 và RHEL 7.9.
Đã sửa đổi /SOURCE-DIRECTORY/include/linux/syscalls.h bình luận ra khỏi dòng ban đầu và thêm tham chiếu đến __64 (bao gồm một dòng trống phía trên nó) -
asmlinkage dài __64_sys_s_enable(int s_enable_flag);
//asmlinkage dài sys_s_enable(int s_enable_flag);
Đã sửa đổi /SOURCE-DIRECTORY/arch/x86/include/asm/syscalls.h thêm -
# SYSCALL BỔ SUNG
440 64 s_enable sys_s_enable
Các trường được phân tách bằng TAB và tôi không thêm bất kỳ dòng trống nào.
Đã tạo thư mục nguồn và tệp -
/SOURCE-DIRECTORY/s_enable chứa s_enable.c.
toàn bộ s_enable.c là
#include <linux/kernel.h>
int bên ngoài s_enable_flag;
asmlinkage dài sys_s_enable(int i)
{
// printk(KERN_INFO "Trong SYSCALL GỐC s_enable\n");
s_enable_flag = i;
trả về 0;
}
Và đã thêm thư mục syscall thích hợp vào Makefile.
core-y += kernel/ certs/ mm/ fs/ ipc/ security/ crypto/ block/ s_enable/
Và chạy "sudo make".
Tôi không chắc mình có thể đã làm sai điều gì khi "make" hoạt động với nguồn nhân ban đầu và lệnh gọi hệ thống mà tôi đang cố gắng thêm đã hoạt động trên các bản phân phối được đề cập khác.
Cảm ơn cho bất kỳ đầu vào bạn có thể cung cấp.