【问题标题】:Cross compiling a kernel module ARM交叉编译内核模块 ARM
【发布时间】: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


【解决方案1】:

如需快速修复,请按如下方式更改您的 Makefile。

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) ARCH=arm CROSS_COMPILE=arm-oe-linux-gnueabi- -C $(KERNEL_DIR) SUBDIRS=$(THIS_DIR) 模块

还要确保在运行 ma​​ke 之前设置交叉编译器工具链路径

导出 PATH = $PATH:PathToToolchain.

还要检查你之前编译的内核是否也为 ARM 架构编译。

【讨论】:

    【解决方案2】:

    如标题所示,它实际上是完美交叉编译的。如果它是使用本机工具链构建的,“Machine”字段将包含 x86_64(或任何您的主机系统),并且尝试在目标上 insmod 会出错。

    默认的 KBuild 输出仅使用“CC”、“LD”作为方便的指示符 - 这些仅代表正在执行的步骤,而不是正在调用的特定命令行(参见 quiet_cmd_* 在 @ 987654321@).

    代码实际上不能正常工作的事实是一个完全不同的问题。鉴于您是从旧内核移植此模块,它可能需要更新以说明它使用的changes in some internal interface

    【讨论】:

    • 关于交叉编译成功的原因是什么?您指的是 readelf -h 的哪个属性?我会尝试看看你的建议。
    • @Notelikethat:所以,我仍然在处理这个问题,我真的不知道解决方案是什么。我一直在调查,但没有发现任何东西。所以,我想调查一下你所说的更新内部接口的问题,但我不确定你的意思是什么。你能提供一些关于它的细节吗?我应该重新编译内核并在那里激活一些选项吗?
    • 重点是,从 2.6.whatever 开始,这个模块使用的任何内部函数或数据结构可能已经微妙地改变了它们的行为,实际上可能已经在 sysfs 或其他任何东西中移动了东西。树外驱动程序/模块很可能需要工作以使它们与主线中的更改保持同步。
    猜你喜欢
    • 2014-05-01
    • 1970-01-01
    • 2011-03-28
    • 2018-05-29
    • 2014-01-25
    • 2014-04-30
    • 2020-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多