【问题标题】:Linking shared library in linux kernel在linux内核中链接共享库
【发布时间】:2015-11-02 21:08:28
【问题描述】:

我想修改linux内核。

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

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

当我将它放入Makefile 时,我收到以下错误:

ld: attempted static link of dynamic object

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

【问题讨论】:

  • 您想在内核领域使用的共享库是什么?请编辑您的问题以改进和激励它!
  • 我投票决定将此问题作为题外话结束,因为有关软件开发(包括开发 Unix 内核)的问题最好在 Stack Overflow 上提问。

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


【解决方案1】:

不可能将共享库链接到内核代码(ELF 共享对象是用户空间的东西,使用 ld-linux(8)...)您应该考虑创建一个 kernel module(并使用 modprobe(8)加载它)。阅读Loadable Kernel Module HowTo

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

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

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

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

另请阅读Advanced Linux Programming(主要是关于应用程序编程)和Operating Systems: Three Easy Pieces(以更广泛地了解操作系统)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    • 2012-01-14
    相关资源
    最近更新 更多