[OpenWRT-backfire] toolchain / cross-compiler 的建立

在開發許多 IoT 裝置或是 WiFi AP 時,
由於這些裝置缺乏完整的程式開發的環境,
我們會需要 toolchain /cross-compiler 來輔助我們進行程式的開發,

考慮到所有程式都會編譯成執行檔,
而此執行檔的建立, 又和所使用的系統平台相關,
因此, toolchain 的主要功能即在於提供一套編譯環境,
可以讓你編譯不同平台上可以執行的程式,

以 Raspberry Pi 為例, 可以參考這一篇文章:
https://www.raspberrypi.com.tw/tag/toolchain/
當然, toolchain 中有許多細節, 在此不詳細敘述,
只放上來這一次針對 OpenWRT backfire 製作 toolchain 的步驟,
由於backfire版本過舊, 也列出所需要的修改.

  1. 建立一台ubuntu 12.04的虛擬機, 硬碟容量20G
  2. 關閉SED: $ unset SED
  3. 安裝OpenWrt所需套件, 指令如下:
    $ sudo apt-get install build-essential subversion git-core libncurses5-dev zlib1g-dev gawk flex quilt libssl-dev xsltproc libxml-parser-perl mercurial bzr ecj cvs unzip
  4. 建立並進入ofwrt資料夾, $ mkdir ofwrt; $ cd ofwrt 
  5. 下載 openWRT backfire 版本所需要的檔案, 由於svn已停止支援, 改用git
    $ git clone https://git.openwrt.org/10.03/openwrt.git backfire
  6. 進入backfire資料夾: $ cd backfire
  7. 更改更新packages的位址 (文件為feeds.conf.default)
    加入一行: src-git packages https://git.openwrt.org/10.03/packages.git
    並把原本的 src-svn packages 註解掉
  8. 更新packages: $ ./scripts/feeds update -a
  9. 安裝packages:  $ ./scripts/feeds install -a
  10. 設定make: $ make defconfig; $ make prereq
  11. 針對目標平台硬體設定make: $ make menuconfig (如下圖)
  12. 輸入make, 開始製作環境: $ make

按照正常流程, 到此就算完成了 cross-compiler 的程序,
剩下來就是等 make 抓相關的環境資訊, 完成環境的編譯而已,
不過, 由於 backfire 版本過於老舊, 所以會出現檔案來源消失的老問題,
反映在此流程執行上, 就會出現 make error,
此時, 再次執行$ make V=99, 就可以看到詳細的錯誤訊息, 並校正,
對於此 backfire 版本, 一共碰到兩次檔案消失問題, 分別列出解法如下:

binutils => 更改 script 檔

PKG_NAME:=binutils
PKG_VERSION:=$(call qstrip,$(CONFIG_BINUTILS_VERSION))
BIN_VERSION:=$(PKG_VERSION)

PKG_SOURCE_URL:=https://www.mirrorservice.org/sites/sourceware.org/pub/binutils/releases/
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2

kernel-headers => 更改 script 檔

PKG_NAME:=linux
PKG_VERSION:=$(LINUX_VERSION)
PKG_SOURCE:=$(LINUX_SOURCE)
PKG_SOURCE_URL:=http://ftp.ntu.edu.tw/linux/kernel/v2.6/
HOST_BUILD_DIR:=$(KERNEL_BUILD_DIR)/linux-$(LINUX_VERSION)

script 檔的位置都在:~/ofwrt/backfire/toolchain相對應的資料夾下,
這些資料夾會隨著 make 進程而建立,
更改後就可以走完 make 流程, 完成 cross-compiler,

對於一個透過cross-compiler建立的執行檔, 
我們可以看到資訊如下:
~/code$ file helloworld
helloworld: ELF 32-bit MSB executable, MIPS, MIPS32 rel2 version 1, dynamically linked (uses shared libs), with unknown capability 0x41000000 = 0xf676e75, with unknown capability 0x10000 = 0x70403, not stripped
是無法直接在ubuntu 12.04下執行, 必須到目標環境中執行,
如下圖顯示執行結果:




留言

熱門文章

LTE筆記: RSRP, RSSI and RSRQ

[WiFi] WiFi 網路的識別: BSS, ESS, SSID, ESSID, BSSID

LTE筆記: 波束成型 (beamforming) 和天線陣列