链接linux内核中的共享库

时间:2015-08-10 17:15:19

标签: linux-kernel makefile dynamic-linking shared-libraries

我想修改linux内核。

我想在文件kernel/panic.c中使用共享库(Makefile文件)中的函数。

不幸的是,我不知道如何编译它。

当我把它放到ld: attempted static link of dynamic object时,我收到以下错误:

{{1}}。

有没有办法将共享库文件放到Linux内核中,或者我是否需要重新编译我的库以获取目标文件。

1 个答案:

答案 0 :(得分:5)

无法将共享库链接到内核代码(ELF共享对象是用户空间的事情,使用ld-linux(8) ...)您应该考虑制作kernel module(并使用modprobe(8)加载它)。阅读Loadable Kernel Module HowTo

内核模块*.ko在概念上类似于共享对象*.so,但linking机制不同。

顺便说一句,你通常应该避免编写内核代码,而应该更喜欢编写应用程序代码。换句话说,修改内核通常是一个坏主意,并且不赞成。

此外,内核空间中可用的API与用户空间API(扩展C standard libraryPOSIX函数)不同。例如,内核模块(和内核代码)没有(因此无法调用)fopenfprintffork;内核是一个独立的C应用程序。此外,内核代码不能使用任何浮点操作!

Userland应用程序使用system calls中列出的syscalls(2)与内核进行交互(libc正在使用它们,例如printfsystem(3)。内核代码(包括内核模块)不能直接使用系统调用(因为内核提供,请参阅syscalls(2))。

另请阅读Advanced Linux Programming(主要是关于应用程序编程)和Operating Systems: Three Easy Pieces(以获得有关操作系统的更广泛视图)。