u-boot 移植(一)編譯環境搭建
soc
:s3c2440
board
:jz2440
uboot
:u-boot-2016.11
toolchain
:gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabi
前言
在學習了韋東山老師的JZ2400
之前相關的教程,以及uboot
移植的視頻之後,打算自己嘗試移植一下最新版本的uboot
,但是發現,s3c2440的支持在uboot-2017.1
的版本時就已經被移除了,所以選擇了一個最新支持s3c2440
的版本u-boot-2016.11
,這個版本有對於smdk2410
的板級支持,所以可以參考2410進行移植,可以減少一部分工作量。
依賴包安裝
虛擬機的ubuntu
環境搭建,可以參考這篇文章,後面進行源碼配置和編譯的時候可以會提示缺少一些工具,所以在Ubuntu16.04 64bit
系統下安裝以下這些包,應該是不會出現什麼問題;
apt-get update
apt-get install build-essential -y
apt-get install libncurses5-dev -y
apt-get install bison -y
apt-get install flex -y
apt-get install autoconf -y
u-boot 源碼
在瀏覽器上通過搜索引擎下載文件,也可以通過wget
下載,可能鏈接會更新失效,那時候,還得重新一下;
wget http://ftp.denx.de/pub/u-boot/u-boot-2016.11.tar.bz2
tar -xvf u-boot-2016.11.tar.bz2
cd u-boot-2016.11
至此,我們已經進入到u-boot
源碼路徑下了。在這裏,我們可以通過make menuconfig
通過圖形界面的方式對u-boot
進行配置;如下所示
當然,有一部分板級的配置已經保存到configs
路徑下,可以找到smdk2410_defconfig
,可以執行make smdk2410_defconfig
將這個文件裏的配置寫入到.config
中;
總體的編譯指令如下兩條,但是這時候編譯會出現報錯;
make smdk2410_defconfig
make
# output make error information
lib/asm-offsets.c:1:0: error: bad value (armv4t) for -march= switch
/*
^
Kbuild:43: recipe for target 'lib/asm-offsets.s' failed
make[1]: *** [lib/asm-offsets.s] Error 1
Makefile:1285: recipe for target 'prepare0' failed
make: *** [prepare0] Error 2
無法編譯通過,因爲當前系統默認的gcc
編譯器無法支持armv4t
這個架構,所以下面還得設置一下工具鏈;
交叉編譯環境搭建
這裏,我比較推薦Linaro
上的工具鏈,找到一個比較新的版本,然後直接配置,本文直接下載gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabi.tar.xz
;
sudo wget https://releases.linaro.org/components/toolchain/binaries/7.4-2019.02/arm-linux-gnueabi/gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabi.tar.xz
sudo cp gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabi.tar.xz /opt
sudo tar -xvf gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabi.tar.xz
完成上述指令後,/opt/gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabi/
路徑就是我們的工具鏈的根路徑;
但是這裏不打算通過設置環境變量,而是編寫一個編譯腳本,在腳本里對環境變量進行臨時設置;
vi mk.sh
內容如下:
#!/bin/bash
TOOLCHAIN=/opt/gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabi/bin
export ARCH=arm
export PATH=$TOOLCHAIN:$PATH
export CROSS_COMPILE=arm-linux-gnueabi-
make smdk2410_defconfig
make -j4
按下Esc
鍵,然後輸入:wq
進行保存;
chmod 777 mk.sh
爲腳本賦予可執行權限;
./mk.sh #進行編譯
這時候會發現一個報錯如下所示:
arm-linux-gnueabi-ld.bfd: u-boot: Not enough room for program headers, try linking with -N
arm-linux-gnueabi-ld.bfd: final link failed: Bad value
Makefile:1208: recipe for target 'u-boot' failedl
大概是 ld
的bug,需要修改Makefile,具體可以參考這個解決方案,或者降低工具鏈的版本,可以使用版本6.2-2016.11,經過測試可行。
重新執行mk.sh
進行編譯,發現編譯成功;