c - Linux 内核为 vmlinux 提供了 undefined reference ,但编译了 .o 文件

标签 c linux linux-kernel makefile linux-device-driver

我有 2 个驱动程序文件。

dr1.c

dr2.c

dr1.c 执行 EXPORT_SYMBOL(func1)。

dr2.c 通过 dr1.h 中的定义使用它

dr1 和 dr2 都被编译并创建了目标文件。 然而,在内核编译的最后阶段,我得到一个错误 dr2 中 func1 的 undefined reference ,但创建了 dr2 目标文件。

我不明白为什么链接没有发生。

最佳答案

基本上链接不会发生,因为在 dr1.c 中定义的 func1() 的地址对于 dr2.c 是未知的>.

这个问题有两种解决方案:

<强>1。手动将地址告知第二个文件: 在这种情况下,让我们假设模块 dr1.cdr2.c 存在于不同的目录中,并且有自己的 Makefile。首先编译dr1模块。完成后,将 Modules.symvers 文件复制到包含 dr2.c 的目录,然后构建 dr2 模块。 Modules.symvers 基本上包含“导出符号”的地址,通过将其复制到另一个模块的目的地,您可以使其“已知”,从而最终发生链接。

<强>2。对两个模块使用通用的 Makefile : 将dr1.cdr2.c 放在同一目录下,并为其创建一个通用内核Makefile。在 Makefile 中创建以下条目:

obj-m := dr1.o dr2.o

完成后,这两个文件都将被编译,生成一个通用的 Modules.symvers 文件并进行相应链接。

希望这对您有所帮助。

关于c - Linux 内核为 vmlinux 提供了 undefined reference ,但编译了 .o 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26597537/

相关文章:

c - 创建守护进程时打开描述符

c - 新手语法问题 : error: expected ';' before ')' token

python - 我们如何使Python脚本在系统启动时(最好是linux)在安装它的每个系统上自动执行?

c - 为什么在中断处理程序中使用自旋锁

linux-kernel - 一个中断处理程序可以被同一个中断处理程序抢占吗?

linux - 如何判断两个按键是否同时按下?

python - 已解决 : C and Python: fill a file empty through mmap

c++ - 默认情况下通过引用传递的数组?

Linux上的C编程: which distro and tools to use

linux - 如何通过 RDMA (Infiniband) 从 KVM 代码中向另一个 KVM 实例发送消息?