在ubuntu10.04中用git和repo獲得的 android源碼目錄中沒有kernel目錄, kernel需要我們在重新下載。
編譯linux內核映像
a)準備交叉編譯工具鏈
android代碼樹中有一個prebuilt項目,包含了我們編譯內核所需的交叉編譯工具。
註意:雖然Prebuilt下包含了交叉編譯工具,但是編譯時有可能會出現“/bin/sh: arm-eabi-gcc: not found” 這樣的錯誤,因此最好從CodeSourcery上面載用於交叉編譯的工具鏈: http://www.codesourcery.com/gnu_toolchains/arm/download.html 選擇 EABI 解壓縮交叉編譯工具鏈:
$ cd /usr/local/
$ sudo cp ~/arm-2010q1-202-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
$ sudo tar jxvf arm-2010q1-202-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
此時會解壓出來一個叫做arm-2010q1的一個目錄,這裏面就是工具鏈了。 設置一下環境變量:
$ export PATH=$PATH:/usr/local/arm2007q3/bin
好了,到此,基本的內核編譯環境就搞好了。
b)設定環境變量
$ emacs ~/.bashrc
增加如下兩行:
export PATH=$PATH:~/android/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin
export ARCH=arm
保存後,同步變化:
$ source ~/.bashrc
c)獲得合適的內核源代碼
$ cd ~/android
獲得內核源代碼倉庫
$ git clone git://android.git.kernel.org/kernel/common.git kernel
$ cd kernel
$ git branch
顯示
* android-2.6.27
說明你現在在android- 2.6.27這個分支上,也是kernel/common.git的默認主分支。
顯示所有head分支:
$ git branch -a
顯示
* android-2.6.27
remotes/origin/HEAD -> origin/android-2.6.27
remotes/origin/android-2.6.25
remotes/origin/android-2.6.27
remotes/origin/android-2.6.29
remotes/origin/android-goldfish-2.6.27
remotes/origin/android-goldfish-2.6.29
我們選取最新的android-goldfish-2.6.29,其中goldfish是 android的模擬器模擬的CPU。
$ git checkout -b android-goldfish-2.6.29 origin/android-goldfish-2.6.29
$ git branch
顯示
android-2.6.27
* android-goldfish-2.6.29
我們已經工作在android-goldfish-2.6.29分支上了。 d)設定交叉編譯參數
打開kernel目錄下的Makefile文件, 1. ARCH ?= $(SUBARCH) 改為: ARCH ?= arm 2. 把CROSS_COMPILE指向剛才下載的prebuilt中的arm-eabi編譯器
CROSS_COMPILE ?= arm-eabi- 註意:如果是按照上述方法重新下載的交叉編譯工具則按照下面方法修改
CROSS_COMPILE ?= arm-none-linux-gnueabi-
這個就是剛剛的下載和解壓的工具鏈的前綴了,旨在告訴make,在編譯的時候要使用我們的工具鏈。
3. 把LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,\
$(call ld-option, -Wl$(comma)–build-id,))
這一行註釋掉,並且添加一個空的LDFLAGS_BUILD_ID定義,如下:
LDFLAGS_BUILD_ID =
把它註釋掉的原因是目前android的內核還不支持這個選項。--build-id選項,主要是用於在生成的elf 可執行文件中加入一個內置的id,這樣在core dump,或者debuginfo的時候就可以很快定位這個模塊是 哪次build的時候弄出來的。這樣就可以避免,每次都把整個文件做一遍效驗,然後才能得到該文件的是由 哪次build產生的。對於內核開發者來說,這是很不錯的想法,可以節約定位模塊版本和其影響的時間。 目前,該功能還出於early stage的狀態,未來的android或許會支持,但至少目前的版本是不支持的。 所以,用#註釋掉即可,或者害怕不保險的話,就加入LDFLAGS_BUILD_ID=空,這樣即使編譯的時候用了, 也只是一個空格而已。
e)編譯內核映像
$ cd ~/android/kernel
$ make goldfish_defconfig
$ make
f)測試生成的內核映像
$ emulator -avd myavd -kernel ~/android/kernel/arch/arm/boot/zImage
|