我想修改linux内核。
我想在文件kernel/panic.c
中使用共享库(Makefile
文件)中的函数。
不幸的是,我不知道如何编译它。
当我把它放到ld: attempted static link of dynamic object
时,我收到以下错误:
{{1}}。
有没有办法将共享库文件放到Linux内核中,或者我是否需要重新编译我的库以获取目标文件。
答案 0 :(得分:5)
无法将共享库链接到内核代码(ELF共享对象是用户空间的事情,使用ld-linux(8) ...)您应该考虑制作kernel module(并使用modprobe(8)加载它)。阅读Loadable Kernel Module HowTo。
内核模块*.ko
在概念上类似于共享对象*.so
,但linking机制不同。
此外,内核空间中可用的API与用户空间API(扩展C standard library和POSIX函数)不同。例如,内核模块(和内核代码)没有(因此无法调用)fopen
或fprintf
或fork
;内核是一个独立的C应用程序。此外,内核代码不能使用任何浮点操作!
Userland应用程序使用system calls中列出的syscalls(2)与内核进行交互(libc
正在使用它们,例如printf
或system(3)。内核代码(包括内核模块)不能直接使用系统调用(因为内核提供,请参阅syscalls(2))。
另请阅读Advanced Linux Programming(主要是关于应用程序编程)和Operating Systems: Three Easy Pieces(以获得有关操作系统的更广泛视图)。