【求助,这个比较难】关于编译.ko文件的问题。

fzc115100 2010-11-16 09:51:07
想实现一个交叉编译。在虚拟机上编译一个.KO文件,然后希望该模块可以在另一台开发板上运行。
虚拟机和开发板内核版本相同,2.6.23和2.6.28均试过。提示错误如下:
insmod:hello.ko
hello: version magic '2.6.28 SMP mod_unload modversions 686' should be '2.6.28 preempt mod_unload PENTIEM4'
insmod: cannot insert 'hello.ko': invalid module format.

提示完毕。
hello.c很简单。我就不写了。
makefile如下:
ifneq ($(KERNELRELEASE),)
obj-m := hello.o
else
KBUILD := /lib/modules/2.6.28/build
modules:
make -C $(KBUILD) M=$(shell pwd) modules
clean:
rm -f *.o *~ core .depend .*.cmd *.ko *.mod.c
rm -rf .tmp_versions
endif

makefile完毕。

build目录下makefile很长,暂时认为没有问题。

提示:虚拟机的cpu架构和开发板的架构是不一样的。
虚拟机为E7500,开发板为奔腾4。


请问关于架构相关的东西应该在哪里更改?

多谢!
...全文
481 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
梁大宝 2012-01-29
  • 打赏
  • 举报
回复
vermagic.h的问题?是什么意思?怎样操作?
fzc115100 2010-11-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ma100 的回复:]
我的主机是x86的, 开发板是 arm 的, 所以把交叉编译环境指定为arm的
你可以把你的交叉编译环境改成x86的 , 编译器也指定一下, 因为你现在默认的编译器应该不是x86的
然后kernle下的makefile就不用改了
[/Quote]

汗~~~不会改。。。
ma100 2010-11-16
  • 打赏
  • 举报
回复
我的主机是x86的, 开发板是 arm 的, 所以把交叉编译环境指定为arm的
你可以把你的交叉编译环境改成x86的 , 编译器也指定一下, 因为你现在默认的编译器应该不是x86的
然后kernle下的makefile就不用改了
fzc115100 2010-11-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ma100 的回复:]
CROSS_ARCH := ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
ifneq ($(KERNELRELEASE),)
obj-m := hello.o
else
KBUILD := /lib/modules/2.6.28/build
modules:
make $(CROSS_ARCH) -C $(KBUILD) ……
[/Quote]

我kernel下的makefile 把arch 改成arch:=i386了。。。
fzc115100 2010-11-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ma100 的回复:]
CROSS_ARCH := ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
ifneq ($(KERNELRELEASE),)
obj-m := hello.o
else
KBUILD := /lib/modules/2.6.28/build
modules:
make $(CROSS_ARCH) -C $(KBUILD) ……
[/Quote]

对不起,因为我是菜鸟 所以没看懂您第一行红色的字是什么意思?
编译器当然用的是gcc喽,版本4.3.2。
您能在解释一下么?
多谢!
ma100 2010-11-16
  • 打赏
  • 举报
回复
CROSS_ARCH := ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
ifneq ($(KERNELRELEASE),)
obj-m := hello.o
else
KBUILD := /lib/modules/2.6.28/build
modules:
make $(CROSS_ARCH) -C $(KBUILD) M=$(shell pwd) modules
clean:
rm -f *.o *~ core .depend .*.cmd *.ko *.mod.c
rm -rf .tmp_versions
endif
交叉编译器写上你的编译器, 然后kernel下的makefile都不用动
fzc115100 2010-11-16
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 pacificdlut 的回复:]
引用 3 楼 fzc115100 的回复:

引用 1 楼 ma100 的回复:
CROSS_ARCH := ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
ifneq ($(KERNELRELEASE),)
obj-m := hello.o
else
KBUILD := /lib/modules/2.6.28/build
module……
[/Quote]

谢谢楼上,问题刚刚解决。
是因为vermagic.h的问题。更改之后正常了。。
谢谢谢谢!
结贴!
NonActive 2010-11-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 fzc115100 的回复:]

引用 1 楼 ma100 的回复:
CROSS_ARCH := ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
ifneq ($(KERNELRELEASE),)
obj-m := hello.o
else
KBUILD := /lib/modules/2.6.28/build
modules:
make $(CROSS_ARCH) -……
[/Quote]

如果你是交叉编译的话,必须得装目标平台所对应的toolchain。
比如你的目标平台是arm平台,编译器为/usr/local/bin/arm-none-linux-gnueabi-gcc
可以参考一下顺序:
1,把编译器的路径加入 PATH
打开个人配置文件 vi ~/.bashrc
追加行 export PATH=/usr/local/bin:$PATH
退出并保存 :wq
使刚才的修改生效 source ~/.bashrc
2,编译
fzc115100 2010-11-16
  • 打赏
  • 举报
回复
顶顶~~~

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧