【发布时间】:2014-10-23 17:00:22
【问题描述】:
我正在尝试为 ARM 交叉编译一个模块。我正在使用 Sabrelite 作为具有 3.0.35 内核版本的板。我正在使用 open-embedded 来生成内核映像。
我拥有交叉编译所需的所有工具链,如下所述:
回声 $CC :
arm-oe-linux-gnueabi-gcc -march=armv7-a -mthumb-interwork -mfloat-abi=hard -mfpu=neon -mtune=cortex-a9 --sysroot=/usr/local/oecore-x86_64/sysroots/cortexa9hf-vfp-neon-oe-linux-gnueabi
echo $CROSS_COMPILE: arm-oe-linux-gnueabi-
回声 ARCH: 手臂
(这只是我工具链的一部分。)
这是我的 makefile 的一部分:
KSRC = kaodv-mod.c kaodv-debug.c kaodv-netlink.c kaodv-queue.c kaodv-ipenc.c kaodv-expl.c
KERNEL_DIR=/home/user/script_emulation/AODV/kernel
KERNEL_INC=$(KERNEL_DIR)/包括 THIS_DIR=$(shell pwd)
obj-m += kaodv.o kaodv-objs := kaodv-mod.o kaodv-debug.o kaodv-netlink.o kaodv-queue.o kaodv-ipenc.o kaodv-expl.o
默认值:
$(MAKE) -C $(KERNEL_DIR) SUBDIRS=$(THIS_DIR) 模块
当我使用 make 命令启动它时,我得到一个模块 (.ko) 但奇怪的是生成的模块是使用我的主机工具链编译的,这意味着 makefile 正在调用本机编译器而不是交叉编译器.我究竟做错了什么?交叉编译器的二进制文件在我的路径中。
这是我在终端上得到的输出的一部分:
CC /home/user/script_emulation/AODV/aodv-uu/lnx/kaodv.mod.o
LD [M] /home/user/script_emulation/AODV/aodv-uu/lnx/kaodv.ko
我们可以看到这里使用的是原生 CC 和 LD,而不是交叉编译工具
谁能提出解决方案?
谢谢
更新:
$ readelf -h kaodv.ko
ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: REL (Relocatable file)
Machine: ARM
Version: 0x1
Entry point address: 0x0
Start of program headers: 0 (bytes into file)
Start of section headers: 13480 (bytes into file)
Flags: 0x5000000, Version5 EABI
Size of this header: 52 (bytes)
Size of program headers: 0 (bytes)
Number of program headers: 0
Size of section headers: 40 (bytes)
Number of section headers: 33
Section header string table index: 30
【问题讨论】:
-
KBuild 输出中的 "CC"、"LD" 等只是漂亮的打印,它们不一定是实际的命令。使用
make V=1 ...查看它实际在做什么。您能否确认 .ko 文件确实是错误的格式,例如自述? -
谢谢,这是我得到的输出: echo " ERROR: Kernel configuration is invalid."; \ echo " 缺少 include/generated/autoconf.h 或 include/config/auto.conf。";\ echo " 在内核 src 上运行 'make oldconfig && make prepare' 来修复它。"; \这意味着我必须重新配置我的内核(我已经完成了!!!)
-
@Notlikethat 是的,.ko 文件的格式错误,因为我已经在目标上对其进行了测试,但它根本无法正常工作
-
Define "does not work as it should be" ;) 您能否将
readelf -h kaodv.ko的输出以及目标系统上insmod返回的任何错误添加到问题中? -
嗯,它是一个 Ad hoc 网络模块。在 insmod 命令之后,我没有得到任何输出。在我看来,该模块已完美融入内核。但是,一旦我这样做了,ssh 就不再响应了,我也无法 ping 我的板。所以,我使用串行调试电缆。看来板子的本机IP栈被模块杀死了。该模块应该作为用户空间守护进程运行,维护内核路由表。当我删除模块时,我得到如下输出:write failed broken pipe。之后,ssh 重新启动,我可以 ping 它了。
标签: c linux-kernel arm cross-compiling