使用arm-eabi-gcc进行交叉编译模块

时间:2016-08-19 11:21:46

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

我有一个视频模块,我正在使用arm-eabi-gcc交叉编译器进行编译。我用以下命令编译 $ arm-eabi-gcc -O2 -DMODULE -D__KERNEL__ -W -Wall -isystem /lib/modules/ uname -r /build/include panel-xxxxxxx.c

我收到以下错误

 In file included from /lib/modules/3.13.0-32-generic/build/include/linux/types.h:5:0,
             from /lib/modules/3.13.0-32-generic/build/include/linux/list.h:4,
             from /lib/modules/3.13.0-32-generic/build/include/linux/module.h:9,
             from panel-gis317.c:17:
/lib/modules/3.13.0-32-generic/build/include/uapi/linux/types.h:4:23: fatal error: asm/types.h: No such file or directory
compilation terminated.

在搜索谷歌后,我发现我需要指定硬件架构,但我找不到在命令行上使用arch gcc的正确用法。

任何人都可以建议我使用什么标志在命令行上交叉编译一个给.c文件(模块),而不使用Makefile

注意:我这样做是为了在硬件上insmod .ko模块进行测试。

BTW在.o文件的帮助下,我们能否知道cross-compiler用于编译.c file

3 个答案:

答案 0 :(得分:2)

使用linux内核架构,具体包含在arch // include中。虽然它可能无法确保正确的编译只是设置...

但是尝试将/ lib / modules / $(uname -r)/ build / arch / arm / include添加到包含路径中。

这是一个简单的指南,用于在PC上为Pi2构建自己的内核和模块: http://lostindetails.com/blog/post/Compiling-a-kernel-module-for-the-raspberry-pi-2

他们使用makefile方法。

答案 1 :(得分:0)

以下链接将为您提供帮助 Cross-compiling of kernel module for ARM architecture

这也有一个make文件方法的例子。 作为旁注,如果你想了解Linux中“asm / types.h”的重要性,你可以看看这里有什么功能使用它。 http://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html

要了解有关out(.o)文件的更多信息,请使用命令“file”

“file outputfilename.o”如果您正在交叉编译文件并且使用64位系统作为主机且目标是32位,则可以在此处进行验证。在适当的工作情况下,您的编译输出将为32位。

答案 2 :(得分:0)

构建核心内核模块的方式有很多改变。

首先,使用内核Makefile而不是直接调用编译器,以获得所有必需的CFLAGS。

其次,指定CROSS_COMPILE = arm-eabi-因为构建中需要其他binutil。

从包含模块源代码和Makefile的目录运行以下命令:

$ make CROSS_COMPILE=arm-eabi- -C <path_to_kernel_src> M=$PWD

由单个源文件组成的模块的Makefile将包含以下行:

obj-m := panel-xxxxxxx.o

内核kbuild Makefile规则将负责生成modinfo源文件,并将它们编译并链接到.k​​o模块二进制文件中。

有关详细信息,请参阅Documentation/kbuild/modules.txt