比較多的arm-linux-gcc版本包有:
arm-linux-gcc-2.95.3.tgz
arm-linux-gcc-3.3.2.tar.bz2
arm-linux-gcc-3.4.1.tar.bz2
這幾個包在網上都比較容易下載到,由於在3.4.1版本中使用的是硬浮點,對
於u-boot使用軟浮點來說不適合。可以使用較低版本來編譯u-boot。我使用的
是arm-linux-gcc-3.3.2.tar.bz2。
我使用的是debian5.0
錯誤記錄:
1.使用arm-linux-gcc-3.4.1軟浮點報錯:
lib_arm/libarm.a(_udivsi3.o)(.text+0x8c):/home/qsg/u-boot-
1.2.0/lib_arm/_udivsi3.S:67: relocation truncated to fit:
R_ARM_PLT32 __div0
lib_arm/libarm.a(_umodsi3.o)(.text+0xa8):/home/qsg/u-boot-
1.2.0/lib_arm/_umodsi3.S:79: relocation truncated to fit:
R_ARM_PLT32 __div0
{
這是因為你用的編譯的版本不一致,
你的uboot裡面指定了 -msoft-float 編譯選項, 是軟浮點的,
但是你串連的gcc庫是用的硬浮點的,
解決辦法
1, 把uboot裡面的Makefile裡面的 “-msoft-float”去掉;
或者
2,換一個soft float軟浮點的 工具鏈;
I know there is a link error happened when the arm-linux ld want
to link two different types of libs.
編譯使用的是arm-linux-gcc-3.4.1.tar.bz2,可能由於glibc使用
Hardware FP,而U-boot使用的是
Software FP,所以無法正確連結,可能要將glibc用Software FP的方法
重新編譯,怎樣重新編譯呢?
有人建議編譯u-boot的時候用2.95.3 編譯核心時用3.4.1
在網上找google 了一會,發現什麼patch to fix the problem,可惜看
不懂這個補丁。
無奈之下只好grep R_ARM_PLT32 -r u-boot根目錄,就是找不到哪個檔案
裡有這個參數。
}
別人出現過的錯誤以及修改方法:
錯誤二:
make[1]: *** 沒有規則可以建立“libmy2410.a”需要的目標“smdk2410.o”
。 停止。
make[1]: Leaving directory `/home/tom/u-boot-1.1.4/board/my2410'
make: *** [board/my2410/libmy2410.a] 錯誤 2
解決方案:
修改board/my2410/Makefile
將28行的
OBJS := smdk2410.o flash.o
改為
OBJS := my2410.o flash.o
錯誤三:
isystem /usr/local/arm/bin/../lib/gcc-lib/arm-linux/3.2/include
-pipe -DCONFIG_ARM -D__ARM__ -march=armv4 -mtune=arm7tdmi -msoft-
float -mabi=apcs-gnu -Uarm -Wall -Wstrict-prototypes -c -o
hello_world.o hello_world.c
cc1: invalid option `abi=apcs-gnu'
出錯的檔案是/cpu/arm920t/下的config.mk:將
PLATFORM_CPPFLAGS +=$(call cc-option,-mapcs-32,-mabi=apcs-gnu)
改成:
PLATFORM_CPPFLAGS +=$(call cc-option,-mapcs-32,$(call cc-option,-
mabi=apcs-gnu),)
錯誤四:
把編譯好的uboot燒進nand flash不能運行,什麼反應都沒有,
看來還是要從代碼改起
原來是沒有加nand flash的驅動,燒進nand flash不能運行,
燒進nor flash 可以運行了,不過命令提示字元是
smdk2410,看看在哪兒可以改為自己定義的
Bug 1
cc1: error: invalid option `abi=apcs-gnu'
------------------------------------------------------------------
1)改用GCC為arm-linux-gcc-3.4.1.tar.bz2即可. 或者:
2)出錯的檔案是/cpu/arm920t/下的config.mk:
將
PLATFORM_CPPFLAGS +=$(call cc-option,-mapcs-32,-mabi=apcs-gnu)
改成:
PLATFORM_CPPFLAGS +=$(call cc-option,-mapcs-32,$(call cc-
option,-mabi=apcs-gnu),)
Bug 2
make[1]: *** 沒有規則可以建立“all”需要的目標“hello_world.srec”。
停止。
------------------------------------------------------------------
make[1]: Leaving directory `/home/a-ki/at91rm9200/u-boot-
1.1.4/examples'
make: *** [examples] 錯誤 2
在網上查了查,有人說是make 3.81的一個BUG!
http://blackfin.uclinux.org/gf/project/u-boot/tracker/?action
=TrackerItemEdit&tracker_item_id=1324
可以簡單的改一個目錄examples下的Makefile來解決:
vi examples/Makefile
#SREC = hello_world.srec
#BIN = hello_world.bin hello_world
SREC = hello_world.o
BIN = hello_world.o hello_world
===========================================================
下載了uboot的目錄結構如下所示
目錄 內容
Board 和一些已有開發板有關的檔案. 每一個開發板都以一個子
目錄出現在當前目
錄中,比如說:SMDK2410,子目錄中存放與開發板相關
的設定檔.
Common 實現uboot命令列下支援的命令,每一條命令都對應一個文
件。例如go命令對
應就是cmd_boot.c
Cpu 與特定CPU架構相關目錄, 每一款uboot下支援的CPU在
該目錄下對應一個子 目錄,比如有子目錄arm920t等。
Disk 對磁碟的支援
Doc 文檔目錄。uboot有非常完善的文檔,推薦大家參考閱讀。
drivers uboot支援的裝置驅動程式都放在該目錄,比如各種網卡、
支援CFI的Flash、串口和USB等。
Fs 支援的檔案系統,uboot現在支援cramfs、fat、fdos、jffs2和
registerfs。
uboot使用的標頭檔,還有對各種硬體平台支援的彙編檔案,系統的配
置檔案
和對檔案系統支援的檔案。 該目錄下configs目錄有與開發板
相關的配置頭文
include
件,如smdk2410.h。該目錄下的asm目錄有與CPU體繫結構相關的頭文
件,asm
對應的是asmarm.
lib_xxxx 與體繫結構相關的庫檔案。如與ARM相關的庫放在lib_arm中。
Net 與網路通訊協定棧相關的代碼,BOOTP協議、TFTP協議、RARP協議和NFS文
件系統
的實現。
Tools Uboot的工具,如:mkimage, crc等等。
===========================================================
編譯記錄:
1.u-boot官方網下載:
http://www.icdev.com.cn/batch.viewlink.php?itemid=1694
2.現在我們要自己在uboot的目錄裡加一點自己的東西好定製自己的板子)'_'
(
先給我們的板子取一個名字,就叫my2410吧,修改主的makefile,加上自己的
配置,可以參照arm已知的配置
my2410_config : unconfig
@./mkconfig $(@:_config=) arm arm920t my2410 NULL s3c24x0
各項的意思如下:
arm:CPU的構架(ARCH)
arm920t:CPU的類型(CPU),對應於cpu/arm920t子目錄
my2410:開發板的型號(BOARD),對應一會兒要建立的board/my2410 目錄
NULL:開發人員或經銷商(vender)
s3c24x0:片上系統(SOC)
3.現在在board目錄下建立自己的板子目錄
tom@tom-ubuntu:~/u-boot$mkdir board/my2410
tom@tom-ubuntu:~/u-boot$ cp board/smdk2410/* board/my2410/ ##直
接拿過來用^_~
tom@tom-ubuntu:~/u-boot$ cd board/my2410
tom@tom-ubuntu:~/u-boot/board/my2410$ mv smdk2410.c my2410.c ##名字
也改一下,不然通不過編譯
4.在my2410的目錄下有一個Makefile檔案,有一句修改為:
COBJS := my2410.o flash.o
5.在include/configs/中建立配置標頭檔:
tom@tom-ubuntu:~/u-boot$ cp include/configs/smdk2410.h
include/configs/my2410.h
6.編譯之前,先
tom@tom-ubuntu:~/u-boot$ make distclean #做一下清除工作,主要是刪除
一些連結檔案
7.如果前面被編譯過請執行
make clean
8.配置編譯環境
tom@tom-ubuntu:~/u-boot$ make my2410_config ##這個my2410_config就是
我們自己加到makefile中去的^__^
這時應該出現
Configuring for my2410 board...
表明沒問題
9.編譯
tom@tom-ubuntu:~/u-boot$ make CROSS_COMPILE=arm-linux-
不出意外的話,應該編譯通過了
編譯完成後,可以得到u-boot各種格式的映像檔案和符號表
# ls -lh u-boot*
u-boot.bin 118K u-boot映像原始的二進位格式
u-boot 448K u-boot映像的ELF格式
u-boot.srec 354K u-boot映像的S-Record格式
u-boot.map 52K u-boot映像的符號表
u-boot的3種映像格式都可以燒寫到Flash中,但需要看載入器能否識別這
些格式。一般u-boot.bin最為常用,直接按照二進位格式下載,並且按照絕對
地址燒寫到Flash中就可以了。u-boot和u-boot.srec格式映像都內建定位資訊
。
10.編譯好後,推薦使用H-jtag燒寫。