本文主要是介绍我的E9嵌入式之旅(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
E9: 编译模块,源码与结果
E9: 编译模块,源码与结果
1.1 模块的编译
在: /opt/Embedsky/TQIMX6/E9/Linux/linux_E9_3.0.35_for_Linux/drivers/hello 添加 hello.c
#include <linux/init.h>
#include <linux/module.h>static int hello_init(void)
{printk(KERN_INFO " Hello World enter\n");return 0;
}static void hello_exit(void)
{printk(KERN_INFO " Hello World exit\n ");
}module_init(hello_init);
module_exit(hello_exit);MODULE_AUTHOR("Wen Zi <wenzi@gmail.com>");
MODULE_LICENSE("Dual BSD/GPL");
MODULE_DESCRIPTION("A simple Hello World Module");
MODULE_ALIAS("a simplest module");
Makefile:
obj-m:=hello.o
hellomodule-objs:=module
KDIR:=/opt/Embedsky/TQIMX6/E9/Linux/linux_E9_3.0.35_for_Linux
MAKE:=make
default: $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
clean: $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) clean
然后编译的输出结果:
make[1]: 正在进入目录 `/opt/Embedsky/TQIMX6/E9/Linux/linux_E9_3.0.35_for_Linux'CC [M] /opt/Embedsky/TQIMX6/E9/Linux/linux_E9_3.0.35_for_Linux/drivers/hello/hello.oBuilding modules, stage 2.MODPOST 1 modulesCC /opt/Embedsky/TQIMX6/E9/Linux/linux_E9_3.0.35_for_Linux/drivers/hello/hello.mod.oLD [M] /opt/Embedsky/TQIMX6/E9/Linux/linux_E9_3.0.35_for_Linux/drivers/hello/hello.ko
make[1]:正在离开目录 `/opt/Embedsky/TQIMX6/E9/Linux/linux_E9_3.0.35_for_Linux'
1.2 编译中的困惑
1.2.1 实际上: KDIR 代表是内核的目录,而且该目录下必有Makefile文件
1.2.2 编译中出现:
make[1]: 正在进入目录 `/opt/Embedsky/TQIMX6/E9/Linux/linux_E9_3.0.35_for_Linux'CC [M] /opt/Embedsky/TQIMX6/E9/Linux/linux_E9_3.0.35_for_Linux/drivers/hello/hello.o
cc1: error: unrecognized command line option "-mlittle-endian"
cc1: error: unrecognized command line option "-mapcs"
cc1: error: unrecognized command line option "-mno-sched-prolog"
cc1: error: unrecognized command line option "-mno-thumb-interwork"
/opt/Embedsky/TQIMX6/E9/Linux/linux_E9_3.0.35_for_Linux/drivers/hello/hello.c:1: error: unknown ABI (aapcs-linux) for -mabi= switch
/opt/Embedsky/TQIMX6/E9/Linux/linux_E9_3.0.35_for_Linux/drivers/hello/hello.c:1: error: bad value (armv5t) for -march= switch
/opt/Embedsky/TQIMX6/E9/Linux/linux_E9_3.0.35_for_Linux/drivers/hello/hello.c:1: error: bad value (armv5t) for -mtune= switch
make[2]: *** [/opt/Embedsky/TQIMX6/E9/Linux/linux_E9_3.0.35_for_Linux/drivers/hello/hello.o] 错误 1
make[1]: *** [_module_/opt/Embedsky/TQIMX6/E9/Linux/linux_E9_3.0.35_for_Linux/drivers/hello] 错误 2
make[1]:正在离开目录 `/opt/Embedsky/TQIMX6/E9/Linux/linux_E9_3.0.35_for_Linux'
make: *** [default] 错误 2
wenzi@wenzi-e9:/opt/Embedsky/TQIMX6/E9/Linux/linux_E9_3.0.35_for_Linux/drivers/hello$ cat hello.c
实际上,未定义: 1.2.1 中 Makefile文件中,所涉及的编译平台以及编译路径:
通过在make后面加入:
make ARCH=arm CROSS_COMPILE=/opt/Embedsky/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/tq-linaro-toolchain/bin/arm-none-linux-gnueabi-
则解决问题
2 模块的加载和卸载
2.1 加载报错1
insmod: error inserting 'hello.ko': -1 Invalid module format
hello.c文件位于:/opt/Embedsky/TQIMX6/E9/Linux/linux_E9_3.0.35_for_Linux/drivers/hello
它实际上是在ARM 嵌入式平台下,编译的;
而在Ubuntu 12.04命令行中 运行 sudo insmod hello.ko 则是基于Ubuntu 12.04的内核的
更改,hello.c的文件路径:
/usr/src/linux-headers-3.11.0-15/drivers/hello
更改Makefile
obj-m:=hello.o
hellomodule-objs:=module
KDIR:=/usr/src/linux-headers-3.11.0-15-generic/
MAKE:=make
default: $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
clean: $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) clean
再次,sudo insmod hello.ko 则不出现2.1所报的错误
2.2 加载报错
insmod: error inserting 'hello.ko': -1 Unknown symbol in module
用dmesg | tail :
hello: Unknown symbol mcount (err 0)
通过网上查找资料发现是 gcc版本的问题,系统软链接的版本是gcc-4.4,需要升级到gcc-4.6,具体实现方法是在:
/usr/bin 进行以下操作:
sudo mv gcc gcc.bak
sudo ln -s gcc-4.6 gcc
再次编译,则上面出现的那个报警消失了:
make -C /usr/src/linux-headers-3.11.0-15-generic/ SUBDIRS=/usr/src/linux-headers-3.11.0-15/drivers/hello modules
make[1]: 正在进入目录 `/usr/src/linux-headers-3.11.0-15-generic'CC [M] /usr/src/linux-headers-3.11.0-15/drivers/hello/hello.oBuilding modules, stage 2.MODPOST 1 modulesCC /usr/src/linux-headers-3.11.0-15/drivers/hello/hello.mod.oLD [M] /usr/src/linux-headers-3.11.0-15/drivers/hello/hello.ko
make[1]:正在离开目录 `/usr/src/linux-headers-3.11.0-15-generic'
利用: dmesg | tail 查看:
[24662.207514] Hello World enter
我的嵌入式”hello word!!!“
未完,待续。。
这篇关于我的E9嵌入式之旅(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!