在Linux内核中链接共享库

3
我希望修改Linux内核。
我想在文件kernel/panic.c中使用共享库(一个.so文件)中的函数。
不幸的是,我不知道如何编译它。
当我将它放入Makefile中时,我收到以下错误: ld:尝试静态链接动态对象。
有没有办法将共享库文件放到Linux内核中,或者我需要重新编译我的库以获得一个目标文件。

你想在内核中使用哪个共享库?请编辑您的问题以改进和激励它! - Basile Starynkevitch
我投票关闭此问题,因为关于软件开发(包括开发Unix内核)的问题最好在[so]上提问。 - derobert
1个回答

5
无法将共享库链接到内核代码中( ELF 共享对象是用户空间的东西,使用 ld-linux(8)……)您应该考虑制作一个 内核模块 (并使用 modprobe(8) 加载它)。阅读 可加载内核模块 HowTo
内核模块 *.ko 在概念上类似于共享对象 *.so,但是 链接 机制不同。
顺便说一句,通常应避免编写内核代码,而应优先编写应用程序代码。换句话说,修改内核通常是个坏主意,并且会受到反对。
此外,内核空间可用的API与用户空间API不同(后者扩展了C标准库POSIX函数)。例如,内核模块(和内核代码)没有(因此不能调用)fopenfprintffork;内核是一个独立的C应用程序。此外,内核代码不能使用任何浮点操作!

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接