我有一个视频模块,我正在使用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
答案 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源文件,并将它们编译并链接到.ko模块二进制文件中。
有关详细信息,请参阅Documentation/kbuild/modules.txt。