下午好。我正在尝试为另一台机器构建helloworld
模块。主机x86_64,目标armhf。
安装了交叉编译器/usr/bin/arm-linux-gnueabihf-gcc,下载了本机的内核源码~/projects/linux-3.4.113
/ ): /usr/bin/arm-linux-gnueabihf-gcc -I~ /projects/linux-3.4.113/ -c ./helloworld.c
(以及类似命令的许多小的变体)
我一遍又一遍地发誓说没有找到linux/modules.h的事实。
有人可以解释我做错了什么以及如何做对吗?helloworld源代码:
/*
* hello-1.c - The simplest kernel module.
*/
#include <linux/module.h> /* Needed by all modules */
#include <linux/kernel.h> /* Needed for KERN_INFO */
int init_module(void)
{
printk(KERN_INFO "Hello world 1.\n");
/*
* A non 0 return means init_module failed; module can't be loaded.
*/
return 0;
}
void cleanup_module(void)
{
printk(KERN_INFO "Goodbye world 1.\n");
}
模块尝试构建的 Makefile 的内容:
CC := g++
TOOLCHAIN := arm-linux-gnueabihf
PT :=
CFL := -Wextra -std=c++11
TPATH := /usr/bin/
LPATH := /usr/$(TOOLCHAIN)/
ARCH := arm
all: helloworld.c
$(TPATH)$(TOOLCHAIN)-$(CC) $(CFL) $(ARCH) -o helloworld.c
基本依赖
要构建外部内核模块,您必须具备:
Makefile
's [linux-headers*
大多数打包发行版中的包内容] 的内核头文件就足够了)典型结构
你好.c:
Kbuild或Makefile,前者是首选。在最简单的情况下,它包含一行:
准备内核源代码树
进一步假设内核源码解压成
/tmp/linux
,交叉编译前缀armv6j-hardfloat-linux-gnueabi
为 ,目标架构为arm
。让我们创建一个配置:
制作 oldconfig 并回答一百个其他问题是可取的,但silentoldconfig 就足够了。注意
-
结尾CROSS_COMPILE
不是错误,应该是这样。值得检查内核中是否启用了模块支持:
为构建模块准备树:
在交叉编译之前,我强烈建议你
helloworld
针对当前的原生内核进行练习和构建,一切都完全一样,但你不需要指定CROSS_COMPILE
和ARCH
。模块组装
make: 进入目录“/tmp/linux”
如您所见,所有内容都在 output 处接收
hello.ko
。只要不依赖其他模块,就可以忽略有关 Module.symvers 的警告。否则,您将需要重建内核本身的模块或获取此文件。
阅读:
文档/kbuild/modules.txt