【问题标题】:Where is the standard kernel libraries to let kernel module link to?让内核模块链接到的标准内核库在哪里?
【发布时间】:2014-05-14 04:08:22
【问题描述】:

内核模块无法调用 libc,因为 libc 在用户空间下运行。
还有一些其他内核指定的 API,比如 printk() 可以使模块正常工作。
据我了解,libc 是几个标准 c 函数 obj(s) 的集合。
它应该存在一个集合(或库)以包含多个内核标准函数对象。
所以我可以将我的内核模块与这些内核标准库链接起来工作,对吧?

简单来说,我的问题如下...

在用户空间:
aaa.o 链接 bbb.o 以调用 myfunc()
aaa.o 链接 libc.so 调用 printf()

在内核空间中:
aaa.ko 链接 bbb.ko 调用 myfunc() ?这是问题1
aaa.ko 链接 xxx 来调用 printk() ? xxx叫什么,问题2

谢谢!

【问题讨论】:

标签: c linux linux-kernel kernel kernel-module


【解决方案1】:

内核模块只能调用内核函数(位于内核的固定部分)。他们不会也不能使用任何外部库。

所以没有内核标准库(它是内核本身包含printk)。

从概念上讲,内核代码是 C 的freestanding 方言;它不使用任何 C 标准库函数(出于晦涩的原因,Linux 内核代码未使用 -ffreestanding dialect optiongcc 编译)

【讨论】:

  • 我对模块构建过程感到困惑。在编译时,GCC 检查了我的模块包含的头文件(例如 init.h module.h),因为我指定了内核头目录。在链接时,GCC 检查由我的模块调用的函数的定义(例如 printk() ),如果没有任何库为我的模块提供函数定义,它怎么能没有任何错误地通过???我知道“运行时”中的模块调用内核函数。谢谢!
【解决方案2】:

你会得到一个 .ko 文件,它是一个内核对象文件。 GCC 没有链接它。您插入它的内核在运行时执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-09
    • 2015-05-05
    • 2011-10-14
    • 1970-01-01
    • 2013-12-27
    • 1970-01-01
    • 2018-03-06
    • 2014-03-01
    相关资源
    最近更新 更多