本帖最后由 David~ 于 2015-3-29 22:20 编辑
发这帖子主要是希望能帮助一些初学者能尽快解决内核编译过程中遇到的一些奇葩问题。
宿主机是centos7 64位的linux,GCC是4.8.0的版本,arm-linux-gcc是3.4.1的版本,被编译的linux源码是2.6.28.7的版本,编译过程遇到不少问题,现在把解决方法总结如下:
1. 为避免出现各种奇葩问题,在编译内核代码之前最好先确认宿主机是否安装有arm-linux-gcc,可以用查看交叉编译器的版本命令来确认:arm-linux-gcc –v如果返回命令找不到的错误,这说明arm-linux-gcc未正确安装,现在说说如何正确安装arm-linux-gcc:
1. 把arm-linux-gcc交叉编译工具拷贝到宿主机这个目录下:/usr/local
2. 解压交叉编译工具,然后找到解压的交叉编译工具链,再里面找到arm文件夹,把arm文件夹拷贝到/usr/local路径下,拷贝完后完整的路径应该是:/usr/local/arm
3. 然后定义环境变量,这样的话每次使用arm-linux-gcc命令,系统都能自动匹配到交叉编译工具链所在的文件夹目录了(假设交叉编译工具链的文件夹目录是/usr/local/arm/3.4.1/bin),具体的方法如下:
方法一:修改/etc/bash.bashrc文件
#vim /etc/bash.bashrc
在最后加上:
export PATH=$PATH:/usr/local/arm/3.4.1/bin
export PATH
方法二:修改/etc/profile文件:
# vim /etc/profile
增加路径设置,在末尾添加如下,保存/etc/profile文件:
export PATH=$PATH:/usr/local/arm/3.4.1/bin
方法三:#export PATH=$PATH:/usr/local/arm/3.4.1/bin
注:(这只能在当前的终端下才是有效的!)
4. 使环境变量生效,不需重启电脑(注:source后面加一个空格)
方法一:source /root/.bashrc
方法二:source /etc/profile
5. 检查路径是否加入到环境变量PATH中:echo $PATH 如果显示的内容中有/usr/local/arm/bin,说明交叉编译工具的路径已经加入到PATH中,支持交叉编译工具安装完成。
6. 测试是否安装成功:arm-linux-gcc –v,如果显示以下信息说明已经安装成功
如果出现以下提示
则说明arm-linux-gcc还未安装成功,主要原因是我们的宿主机系统是64位的操作系统,里面缺少32位的libc库,需要另外安装才可以在64位系统下使用32位的交叉编译工 具,具体方法为使用yum命令安装X86的lib库,命令为:yum installglibc.i686。
如果此时运行arm-linux-gcc –v还提示错误error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory,则继续执行以下命令yum install libstdc++.so.6 。经过这2步,问题应该能得到彻底解决。至此,交叉编译工具安装结束。
2. 确认完arm-linux-gcc安装成功后,现在是要确认被编译的内核源码路径了,被编译的内核源码必须放在这个目录下:/usr/src/xxxx,其中xxxx便是你要编译的内核源码,否则运行make menuconfig时会出以下错误:make: *** No rule to make target `menuconfig'. Stop.
3. 路径确认完毕后,此时再执行make menuconfig命令,运气好的话应该会弹出以下界面:
看到这个界面,肯定是说明内核已经可以成功编译了,运气差的话可能就会看到这个界面了:
为什么会提示mix implicit and normal rules. Stop.呢?这是由于我们的宿主机make管理器版本太高了,linux(centos/fedora)在高版本的make管理器里面都不支持隐式和显式的混合定义方式了,这样只能修改makefile文件了,具体修改方法如下:
错误提示的是第442行有错误,所以进入makefile文件,找到第442行,原代码为:config %config: scripts_basic outputmakefile FORCE ,将其修改成%config: scripts_basic outputmakefile FORCE,然后再执行make menuconfig命令,此时可能还会弹出一个错误信息,如下所示:
说明第1607行还有错误,进入makefile的1607行进行查看,第1607的原代码为:/ %/: prepare scripts FORCE,将其修改为%/: prepare scripts FORCE,然后再执行make menuconfig,此时肯定能看到思慕已久的界面了:
如果此时还没有看到这个界面,基本能说明你的交叉编译工具是有问题的了,它不支持编译你当前的内核版本(2.6.28),可以考虑更换工具链了。
|