1. 程式人生 > >linux交叉編譯和核心編譯

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>
等等