一、工具鏈的制作
1.1 工具
軟件工具:crosstool-ng
下載地址:git clone https://github.com/crosstool-ng/crosstool-ng
crosstool-ng的環境需要libncurse5-dev
sudo apt-get install libncurse5-dev
安裝autoconf: sudo apt-get install autoconf
進入crosstool-ng目錄,執行./bootstrap,生成 configure 執行文件
檢查安裝環境,報什么錯,就安裝什么軟件:./configure --prefix=`pwd`/crosstool
需要的軟件有:
sudo apt-get install gperf bison flex texinfo help2man gawk
執行命令 make執行命令:
make install
export PATH="${PATH}:`pwd`/crosstool/bin"
1.2 開始制作
1.2.1 建立目標文件夾
根目錄下建立三個文件夾:
mkdir src x-tools crosstool

1.2.2 環境
進入crosstool目錄:cd ~/.crosstool
執行:ct-ng list-samples

選擇arm-unknown-linux-gnueabi 作為交差編譯工具鏈的模版
執行命令:ct-ng show-arm-unknown-linux-gnueabi,查看編譯交差編譯工具鏈所需要的配置

下載gcc 6.3.0:wget http://ftp.gnu.org/gnu/gcc/gcc-6.3.0/gcc-6.3.0.tar.gz

執行命令:ct-ng arm-unknown-linux-gnueabi

執行命令:ct-ng menuconfig


選擇 Target options
*** Target optimisations ***
(armv4t) Architecture level :指令集架構,exynos4412為armv7-a架構,-march=name
(arm920t) Emit assembly for CPU :CPU核心類型, -mcpu=name
() Tune for CPU:對CPU的優化,具體可以查看芯片手冊,-mtune=name

最新版本的crosstool-ng只需要選擇第一二項目就好了。
選擇 toolchain options:

u-boot 2016.01 不支持GCC6,因此 要把 GCC的版本改成GCC5.0版本--GCC6.0版本之間。
保存退出。
1.2.3 編譯
執行命令:ct-ng build

編譯成功:

建立環境變量:
vim .bashrc,加入下面一行
PATH=~/x-tools/arm-s3c2440a-linux-gnueabihf/bin:$PATH/
執行 source .bashrc
執行 arm-s3c2440a-linux-gnueabi-gcc -v

u-boot 2016.01 不支持GCC6,因此 要把 GCC的版本改成GCC5.0版本--GCC6.0版本之間。
二、u-boot 工作目錄建立
下載u-boot_2016.01版本,解壓u-boot。

2.1 board目錄修改
2.1.1 創建jz2440板
查看 ../board/samsung/ 目錄下的文件:

此版本中,2440已經被遺棄。所以選定smdk2410為模版創建2440的u-boot。

2.1.2 jz2440文件名修改
修改文件名:

2.1.3 Kconfig修改
修改Kconfig和Makefile文件,將里面的smdk2410修改為jz2440,如下:
Kconfig文件:

2.1.4 Makefile修改

2.2 修改頭文件

頭文件中增加內容:

添加對S3C2440的支持
找到包含smdk2410.h這個頭文件的文件:

沒有需要修改的地方
2.3 修改配置文件
當前新版的u-boot與linux源碼一樣,都執行make menuconfig 進行配置,所以在configs目錄下要有jz2440的配置。
config目錄下配置:


2.5 修改arch/arm下的配置文件
arch/arm/Kconfig,里面添加對jz2440的支持


2.6 修改rch/arm/include/asm/mach-types.h


三、配置.config及編譯u-boot
3.1 配置.config
執行命令:make jz2440_defconfig

執行命令:make menuconfig

在ARM architecture中選擇target_select項,然手選擇jz2440:

配置 u-boot的命令行提示符:


保存退出配置。
3.2 編譯

編譯成功:

四、編譯錯誤
4.1 Not enough room for program headers
arm-2440-linux-gnueabi-ld.bfd: u-boot: Not enough room for program headers, try linking with -N
arm-2440-linux-gnueabi-ld.bfd: final link failed: Bad value
make: *** [Makefile:1193: u-boot] Error 1
解決方法:https://www.mail-archive.com/u-boot@lists.denx.de/msg235861.html
在根目錄的Makefile中加上如下幾行:

