linux交叉编译和内核编译

20181005记
一、交叉编译arm-linux-gcc
由于嵌入式系统资源匮乏,一般不能像 PC 一样安装本地编译器和调试器,不能在本地编写、编译和调试自身运行的程序,而需借助其它系统如 PC 来完成这些工作,这样的系统通常被称为宿主机。
宿主机通常是 Linux 系统,并安装交叉编译器、调试器等工具;宿主机也可以是 Windows系统,安装嵌入式 Linux 集成开发环境。在宿主机上编写和编译代码,通过串口、网口或者硬件调试器将程序下载到目标系统里面运行
所谓的交叉编译,就是在宿主机平台上使用某种特定的交叉编译器,为某种与宿主机不同平台的目标系统编译程序,得到的程序在目标系统上运行而非在宿主机本地运行。这里的平台包含两层含义:一是核心处理器的架构,二是所运行的系统,这样,交叉编译有 3 种情形:
(1) 目标系统与宿主机处理器相同,运行不同的系统;
(2) 目标系统与宿主机处理器不同,运行相同的系统;
(3) 目标系统与宿主机处理器不同,运行不同的系统。

(1)找到gcc编译器路径
gcc路径
(2)在unbuntu中解压当前文件

tar xjvf gcc-4.4.4-glibc-2.11.1-multilib-1.0_EasyARM-iMX283.tar.bz2 -C xxxx
//将gcc-4.4.4解压到xxx目录

(3)支持的交叉编译器
支持的交叉编译器查看在目录: gcc-4.4.4-glibc-2.11.1/arm-fsl-linux-gnueabi/bin
支持的交叉编译器
(4)设置环境变量
以.tar.bz2 方式的发布包,在完成解压后,安装编译器后需要设置环境变量;如果不设置环境变量,如果不指定交叉编译器的完整路径,系统是无法调用交叉编译器的。
设置环境变量:
1、设置临时变量:
export PATH=$PATH:/home/桌面/gcc-4.4.4-glibc-2.11.1/arm-fsl-linux-gnueabi/bin
再次查看PATH值,echo $PATH
2、修改全局配置文件(所有用户):
在终端中添加环境变量,需要每次打开终端进行设置,所以必要时,将它设置到系统文件中。/etc/profile是系统全局的配置文件,在该文件中设置交叉编译的路径。打开终端,输入“sudo vi /etc/profile”,打开/etc/profile文件,在文件末尾添加

export PATH=$PATH:/home/桌面/gcc-4.4.4-glibc-2.11.1/arm-fsl-linux-gnueabi/bin

然后输入“./etc/profile”,执行profile文件,执行刚才修改的文件,使其生效。
3、修改用户配置文件(当前用户)
方法2是修改所有的用户,如果配置只对当前用户有效,推荐使用:“/.bashrc”或者“/.bash_profile”。
使用vi打开,如vi ~/.bashrc,在末尾添加

export PATH=$PATH:/home/桌面/gcc-4.4.4-glibc-2.11.1/arm-fsl-linux-gnueabi/bin

(5)验证交叉编译工具是否可用
输入交叉编译命令,如arm-linux-,按Tab键,出来
测试交叉编译

二、内核编译(交叉编译)
下载内核源码: https://www.kernel.org/pub/linux/kernel网站下载
以下使用ZLG的IMX280配套源码:linux-2.6.35.3.tar.bz2
(1)对于PC机(内核升级或重新编译)
1、解压内核
tar -xvf linux-2.6.35.3.tar.bz2
2、复制内核到/usr/src目录
cp -rf ./linux-2.6.35.3 /usr/src/linux2.6.35
3、使用cd命令进入内核目录
cd /usr/src/linux2.6.35
4、修改Makefile文件

# Default value for CROSS_COMPILE is not to prefix executables
# Note: Some architectures assign CROSS_COMPILE in their arch/*/Makefile
export KBUILD_BUILDHOST := $(SUBARCH)
ARCH		?= $(SUBARCH)   #PC
#ARCH		?= arm                  #arm
#CROSS_COMPILE	?= arm-fsl-linux-gnueabi-
CROSS_COMPILE	?= $(CONFIG_CROSS_COMPILE:"%"=%)

5、编译内核
make menuconfig
make clean
make
make modules_install
make install
6、制作启动盘

sudo mkinitramfs 2.6.35 -o /boot/initrd.img-2.6.35

7、更新grub
sudo update-grub
8、重启,使用新内核,查看新内核版本
reboot,uname -r
(2)对于ARM内核

# Default value for CROSS_COMPILE is not to prefix executables
# Note: Some architectures assign CROSS_COMPILE in their arch/*/Makefile
export KBUILD_BUILDHOST := $(SUBARCH)
#ARCH		?= $(SUBARCH)   #PC
ARCH		?= arm                  #arm
CROSS_COMPILE	?= arm-fsl-linux-gnueabi-
#CROSS_COMPILE	?= $(CONFIG_CROSS_COMPILE:"%"=%)

编译内核
1、make mrproper
2、make menuconfig选择对应的芯片类型,如IMX->imx280A
3、make,编译20分钟左右,表示内核镜像文件已经编译完成,并保存在 arch/arm/boot目录下,其中Image文件是未压缩的内核镜像,zImage是压缩过的内核镜像。

注:编译嵌入式工程时,选择对应的嵌入式编译器和交叉编译内核,否则找不到所需的头文件。(困扰了差不多一个月的问题,编译内核今天才得以解决)

第一步是编译,首先要做的是设置交叉编译器,修改makefile,打开makefile文件,如下:
ifneq ($(KERNELRELEASE),)
obj-m := hello.o
else
KDIR := /forlinux/kernel/linux-2.6.28
all:
make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers
endif
首先需要指定kernel的源代码路径:
我的是KDIR :=/opt/GTStudio/GT2440/opt/GTStudio/GT2440/linux-2.6.30.4/
这个路径由自己决定,移植的arm平台下的linux源代码放在什么地方就填什么路径,如果指定错误的话,会提示找不到下面两个文件的。
#include <arch/gpio.h>
#include <arch/io28.h>
等等

猜你喜欢

转载自blog.csdn.net/Feng_8071/article/details/82947510