『壹』 uboot編譯報錯
哥們 咱兩一樣的問題 我也是201504版本的 你的解決了嗎 告訴一下唄
『貳』 uboot也是用交叉編譯工具編譯的吧 為什麼用交叉編譯工具中沒有make命令呢 該怎樣生效 make,
有Makefile就可以使用Make命令,make命令不是系統自帶的嗎,用了這么久,第一次看到這個問題。Uboot編譯不是很難,以前舊版Uboot編譯好像比新版要簡單一點,特別是上了2010以後,東西不好找。
『叄』 uboot2010-09用arm-linux-gcc3.3.2編譯出現如下錯誤:請問該如何解決
1) 可以試試用arm-softfloat-linux-gnu和和arm-linux-gcc-3.4.5-glibc-2.3.62
2) 也可以改uboot的編譯選項把軟浮點去掉,位置可能在cpu/arm920t/config.mk或類似位置,把其中的-msoft-float去掉
『肆』 uboot編譯
把-MQ的編譯選項去掉試試
『伍』 uboot怎麼樣才可以編譯成自己的u-boot.bin
按照uboot移植手冊,修改源代碼,然後用交叉編譯工具編譯,就會生成uboot.bin文件了。
『陸』 uboot也是用交叉編譯工具編譯的吧 為什麼用交叉編譯工具中沒有make命令呢 該怎樣生效 make
在頂層的makefile中把這段中的examples\目錄刪掉
SUBDIRS = tools \
examples \
post \
post/cpu
試試看 其實編譯進去也沒有任何影響的
從你的截圖看病不是examples的問題,估計可能是你的交叉編譯安裝有問題或者你的u-boot已經在別人的電腦上編譯過了,所以出現問題。看看交叉編譯的環境變數有沒有問題,再不行重裝試試
『柒』 如何查看uboot編譯哪一個board目錄
U-Boot編譯命令
對於mini2440開發板,編譯U-Boot需要執行如下的命令:
$ make mini2440_config
$ make all
使用上面的命令編譯U-Boot,編譯生成的所有文件都保存在源代碼目錄中。為了保持源代碼目錄的干凈,可以使用如下命令將編譯生成的文件輸出到一個外部目錄,而不是在源代碼目錄中,下面的2種方法都將編譯生成的文件輸出到 /tmp/build目錄:
$ export BUILD_DIR=/tmp/build
$ make mini2440_config
$ make all
或
$ make O=/tmp/build mini2440_config (注意是字母O,而不是數字0)
$ make all
為了簡化分析過程,方便讀者理解,這里主要針對第一種編譯方式(目標輸出到源代碼所在目錄)進行分析。
2.1.2 U-Boot配置、編譯、連接過程
U-Boot開頭有一些跟主機軟硬體環境相關的代碼,在每次執行make命令時這些代碼都被執行一次。
1. U-Boot 配置過程
(1)定義主機系統架構
HOSTARCH := $(shell uname -m | \
sed -e s/i.86/i386/ \
-e s/sun4u/sparc64/ \
-e s/arm.*/arm/ \
-e s/sa110/arm/ \
-e s/powerpc/ppc/ \
-e s/ppc64/ppc/ \
-e s/macppc/ppc/)
「sed –e」表示後面跟的是一串命令腳本,而表達式「s/abc/def/」表示要從標准輸入中,查找到內容為「abc」的,然後替換成「def」。其中「abc」表達式用可以使用「.」作為通配符。
命令「uname –m」將輸出主機CPU的體系架構類型。作者的電腦使用Intel Core2系列的CPU,因此「uname –m」輸出「i686」。 「i686」可以匹配命令「sed -e s/i.86/i386/」中的「i.86」,因此在作者的機器上執行Makefile,HOSTARCH將被設置成「i386」 。
(2)定義主機操作系統類型
HOSTOS := $(shell uname -s | tr '[:upper:]' '[:lower:]' | \
sed -e 's/\(cygwin\).*/cygwin/')
「uname –s」輸出主機內核名字,作者使用Linux發行版Ubuntu9.10,因此「uname –s」結果是「Linux」。「tr '[:upper:]' '[:lower:]'」作用是將標准輸入中的所有大寫字母轉換為響應的小寫字母。因此執行結果是將HOSTOS 設置為「linux」。
(3)定義執行shell腳本的shell
# Set shell to bash if possible, otherwise fall back to sh
SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
else if [ -x /bin/bash ]; then echo /bin/bash; \
else echo sh; fi; fi)
"$$BASH"的作用實質上是生成了字元串「$BASH」(前一個$號的作用是指明第二個$是普通的字元)。若執行當前Makefile的shell中定義了「$BASH」環境變數,且文件「$BASH」是可執行文件,則SHELL的值為「$BASH」。否則,若「/bin/bash」是可執行文件,則SHELL值為「/bin/bash」。若以上兩條都不成立,則將「sh」賦值給SHELL變數。
由於作者的機器安裝了bash shell,且shell默認環境變數中定義了「$BASH」,因此SHELL 被設置為$BASH 。
(4)設定編譯輸出目錄
ifdef O
ifeq ("$(origin O)", "command line")
BUILD_DIR := $(O)
endif
endif
函數$( origin, variable) 輸出的結果是一個字元串,輸出結果由變數variable定義的方式決定,若variable在命令行中定義過,則origin函數返回值為"command line"。假若在命令行中執行了「export BUILD_DIR=/tmp/build」的命令,則「$(origin O)」值為「command line」,而BUILD_DIR被設置為「/tmp/build」。
ifneq ($(BUILD_DIR),)
saved-output := $(BUILD_DIR)
# Attempt to create a output directory.
$(shell [ -d ${BUILD_DIR} ] || mkdir -p ${BUILD_DIR})
若${BUILD_DIR}表示的目錄沒有定義,則創建該目錄。
# Verify if it was successful.
BUILD_DIR := $(shell cd $(BUILD_DIR) && /bin/pwd)
$(if $(BUILD_DIR),,$(error output directory "$(saved-output)" does not exist))
endif # ifneq ($(BUILD_DIR),)
若$(BUILD_DIR)為空,則將其賦值為當前目錄路徑(源代碼目錄)。並檢查$(BUILD_DIR)目錄是否存在。
OBJTREE := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))
SRCTREE := $(CURDIR)
TOPDIR := $(SRCTREE)
LNDIR := $(OBJTREE)
… …
MKCONFIG := $(SRCTREE)/mkconfig
… …
ifneq ($(OBJTREE),$(SRCTREE))
obj := $(OBJTREE)/
src := $(SRCTREE)/
else
obj :=
src :=
endif
CURDIR變數指示Make當前的工作目錄,由於當前Make在U-Boot頂層目錄執行Makefile,因此CURDIR此時就是U-Boot頂層目錄。
執行完上面的代碼後, SRCTREE,src變數就是U-Boot代碼頂層目錄,而OBJTREE,obj變數就是輸出目錄,若沒有定義BUILD_DIR環境變數,則SRCTREE,src變數與OBJTREE,obj變數都是U-Boot源代碼目錄。而MKCONFIG則表示U-Boot根目錄下的mkconfig腳本。
2. make mini2440_config命令執行過程
下面分析命令「make mini2440_config」執行過程,為了簡化分析過程這里主要分析將編譯目標輸出到源代碼目錄的情況。
mini2440_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t mini2440 samsung s3c24x0
其中的依賴「unconfig」定義如下:
unconfig:
@rm -f $(obj)include/config.h $(obj)include/config.mk \
$(obj)board/*/config.tmp $(obj)board/*/*/config.tmp \
$(obj)include/autoconf.mk $(obj)include/autoconf.mk.dep
其中「@」的作用是執行該命令時不在shell顯示。「obj」變數就是編譯輸出的目錄,因此「unconfig」的作用就是清除上次執行make *_config命令生成的配置文件(如include/config.h,include/config.mk等)。
$(MKCONFIG)在上面指定為「$(SRCTREE)/mkconfig」。$(@:_config=)為將傳進來的所有參數中的_config替換為空(其中「@」指規則的目標文件名,在這里就是「mini2440_config 」。$(text:patternA=patternB),這樣的語法表示把text變數每一個元素中結尾的patternA的文本替換為patternB,然後輸出) 。因此$(@:_config=)的作用就是將mini2440_config中的_config去掉,得到mini2440。
因此「@$(MKCONFIG) $(@:_config=) arm arm920t mini2440 samsung s3c24x0」實際上就是執行了如下命令:
./mkconfig mini2440 arm arm920t mini2440 samsung s3c24x0
即將「mini2440 arm arm920t mini2440 samsung s3c24x0」作為參數傳遞給當前目錄下的mkconfig腳本執行。
在mkconfig腳本中給出了mkconfig的用法:
# Parameters: Target Architecture CPU Board [VENDOR] [SOC]
因此傳遞給mkconfig的參數的意義分別是:
mini2440:Target(目標板型號)
arm:Architecture (目標板的CPU架構)
arm920t:CPU (具體使用的CPU型號)
mini2440:Board
samsung:VENDOR(生產廠家名)
s3c24x0:SOC
『捌』 從庖丁解牛說uboot如何編譯
其實,這個世界上的萬事萬物,都有一個「紋理」。我讀中學的時候劈柴,如果順著木頭的紋理劈下去很輕易的就劈開了,但如果反其道而行之不但劈不開而且斧頭還會彈回來傷人!呵呵,城裡出生的孩子是沒這個體會,即使現在農村的孩子因為家裡都燒液化氣也沒有這個機會體驗了。 庖丁解牛之所以游刃有餘,是因為他掌握了牛的紋理,順著這些紋理就應該很容易。 那麼我們的uboot的紋理在哪裡呢? 很多初學者,拿到這種代碼從來沒有去看過它的readme或者document!這兩個文本文件是非常重要的東西,可惜呀!很多人不去看readme而去請教別人,google,,跑圖書館。其實,有些東西當你問到別人的時候,聰明的人也是去看readme然後給你解答的。 下面我們就去找uboot的紋理! 本文u-boot版本U-Boot 1.1.4 我們按正常人的思維(智商90)來分析。 首先,是要編譯,那麼編譯就要執行命令make,而make實際上就是執行makefile文件。第一次make肯定是不能成功的。聽從觀音菩薩的教誨「從哪裡來就到哪裡去」!make 出問題,我們就去makefile里找原因。Makefile里有這樣一段話: TOPDIR := $(shell if [「$$PWD」 != 「」]; then echo $$PWD; else pwd; fi) export TOPDIR ifeq (include/config.mk,$(wildcard include/config.mk)) # load ARCH, BOARD, and CPU configuration include include/config.mk export ARCH CPU BOARD VENDOR SOC # load other configuration include $(TOPDIR)/config.mk ifndef CROSS_COMPILE ifeq ($(HOSTARCH),ppc) CROSS_COMPILE = else ifeq ($(ARCH),ppc) CROSS_COMPILE = powerpc-linux- endif ifeq ($(ARCH),arm) CROSS_COMPILE = /usr/local/arm/2.95.3/bin/arm-linux- endif ifeq ($(ARCH),i386) ifeq ($(HOSTARCH),i386) CROSS_COMPILE = else CROSS_COMPILE = i386-linux- endif endif ifeq ($(ARCH),mips) CROSS_COMPILE = mips_4KC- endif ifeq ($(ARCH),nios) CROSS_COMPILE = nios-elf- endif ifeq ($(ARCH),nios2) CROSS_COMPILE = nios2-elf- endif ifeq ($(ARCH),m68k) CROSS_COMPILE = m68k-elf- endif ifeq ($(ARCH),microblaze) CROSS_COMPILE = mb- endif endif endif export CROSS_COMPILE 這段腳本就是設置交叉編譯路徑CROSS_COMPILE,在設置這個路徑前要判斷我們所用的平台是什麼,即ARCH是什麼。我們這里以ARM為例。1 2
『玖』 如何運行U-boot目錄下examples下的hello
hello_world不是UBOOT命令, 當然你可以把它移植成為UBOOT命令, 但並沒有意義.
編譯hello_world完成後, 可以生成.srec 或.bin格式
1. 如果你在編譯UBOOT時配置了loads命令, 可以運行loads來載入.srec (再運行run命令來執行. 有點記不清楚是否是run命令)
2. 如果 如果你在編譯UBOOT時配置了loadb命令, 可以運行loads來載入.bin (再運行run命令來執行. 有點記不清楚是否是run命令)
3. 跟燒寫uboot一樣, 把example.bin寫入flash, 然後運行go 0xaddress+4 (the start addr of .bin)
『拾』 uboot2012用什麼版本的編譯器好
用arm-linux-gcc(如果你的處理器是ARM的話),具體有好多版本,一般都是直接用開發板公司提供的,這樣比較保證,因為重新編譯一個編譯器還是比較麻煩的事(想自己編譯一個編譯器的話,就用Cross tools吧)。