Tôi đang làm việc trong Ubuntu. Tôi đang cố gắng tạo hai mô-đun hạt nhân sử dụng từng chức năng khác. Vấn đề của tôi là tôi có các mô-đun được biên dịch đúng cách, nhưng biểu tượng không được giải quyết cho một trong số chúng.không thành công không thành công với "Biểu tượng không xác định trong mô-đun" cho biểu tượng được xác định trong một mô-đun khác
Để đơn giản, hãy gọi các mô-đun này là m1
và m2
.
m2 là chức năng xuất void func_m2(void)
. m1
đang gọi chức năng này. Cả hai mô đun đều biên dịch đúng cách.
Sau khi tất cả biên dịch, tôi cần tải trước mô-đun m2
(vì nó đã xuất func_m2
chức năng) và sau đó là mô-đun m1
. Vì vậy, chúng ta hãy làm cho nó:
[email protected]:~/development/kmodules/m2$ sudo insmod ./m2.ko
Bây giờ, cho phép tải m1
mô-đun mà đang cố gắng sử dụng func_m2
:
[email protected]:~/development/kmodules/m1$ sudo insmod ./m1.ko
insmod: error inserting './m1.ko': -1 Unknown symbol in module
Sau đây là những gì tôi nhìn thấy trong nhật ký:
[email protected]:~/development/kmodules/m1$ dmesg | tail
[ 3938.166616] Loading m2 module ...
[ 3963.078055] m1: no symbol version for func_m2
[ 3963.078059] m1: Unknown symbol func_m2
Vì vậy, có vẻ như các tham chiếu đến ký hiệu func_m2
không được giải quyết. Hấp dẫn. Hãy kiểm tra xem nó có trong bảng biểu tượng không:
[email protected]:~/development/kmodules$ cat /proc/kallsyms | grep 'func_m2'
ffffffffa00530d0 r __ksymtab_func_m2 [m2]
ffffffffa00530e8 r __kstrtab_func_m2 [m2]
ffffffffa00530e0 r __kcrctab_func_m2 [m2]
ffffffffa0053000 T func_m2 [m2]
000000004edd543f a __crc_func_m2 [m2]
Như bạn có thể thấy, func_m2
thực sự xuất hiện trong bảng ký hiệu. Vậy tại sao không thể tải được m1
?
Tôi đã cài đặt đúng tiêu đề Linux cho nguồn kernel và Linux của mình. Tôi không thực hiện bất kỳ sửa đổi nào trong hạt nhân, nó không bị ảnh hưởng và phiên bản của nó là: 2.6.31-16-generic (Tôi chạy x64)
Bây giờ, để hiển thị cho bạn bức tranh đầy đủ, tôi đặt mã nguồn và Makefile ở đây Tôi đã sử dụng cho thử nghiệm này cho cả hai mô-đun m1
và m2
.
m1
mô-đun:
m1.c:
#include <linux/module.h>
#include <linux/kernel.h>
extern void func_m2(void);
int hello_start(void)
{
printk(KERN_INFO "Loading m1 module ...\n");
func_m2();
return 0;
}
void hello_end(void)
{
printk(KERN_INFO "Unloading m1 ...\n");
}
module_init(hello_start);
module_exit(hello_end);
MODULE_LICENSE("GPL");
Makefile:
obj-m := m1.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
m2
mô-đun:
m2.c:
#include <linux/module.h>
#include <linux/kernel.h>
int hello_start(void)
{
printk(KERN_INFO "Loading m2 module ...\n");
return 0;
}
void hello_end(void)
{
printk(KERN_INFO "Unloading m2 ...\n");
}
void func_m2(void)
{
printk(KERN_INFO "This a function in m2\n");
}
module_init(hello_start);
module_exit(hello_end);
MODULE_LICENSE("GPL");
EXPORT_SYMBOL(func_m2);
Makefile:
obj-m := m2.o
export-objs := m2.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
Về cơ bản câu hỏi của tôi là: Tại sao không thể m1
được nạp?
Sẽ rất hữu ích nếu ai đó có thể trả lời.
https://serverfault.com/questions/124128/linux-says-a-kernel-module-has-an-unknown-symbol-but-another-loaded-module-prov –