2014年4月12日土曜日

ARM Cross Compile環境作成

Emdebianのクロスコンパイル環境を使っていたが、ls-qlのlibcとバージョンが合っていない。ls-qlのlibcのバージョンの合ったクロスコンパイル環境を作成する。

前提

作成するクロスコンパイル環境

ls-qlのlibc, kernelのバージョンと合わせたクロスコンパイル環境を作成する。ls-qlのlibc, kernelをコンパイルしたgccのバージョンは分からないので、ビルドエラーが出にくそうなバージョンを選ぶことにする。
ls-qlのlibcは、eglibc 2.5 (/lib/libc-2.5.soから)、kernelは、linux-2.6.22_lsp.3.0.5 (buffaloのOpen Sourceのページにあるから)、と判断。

クロスコンパイル環境をビルドする環境

makeは、3.81
gccは、4.4.5 (gcc--version : gcc (Debian 4.4.5-8) 4.4.5)

手順

eglibcのEGLIBC.cross-building に従う。
参考2.に、シェルスクリプトがあり、活用する。変更は、eglibc, kenelへのパッチ当てとconstruct sysrootの追加、インストール先のディレクトリ構成(tools, sysroot)の変更。
install_gcc.sh

ビルドするソース(クロスコンパイル環境のソース)

gmp=gmp-4.3.2
mpfr=mpfr-2.4.2
mpc=mpc-0.8.1
binutils=binutils-2.23.2
gcc=gcc-4.6.3
eglibc=eglibc-2.5
linux=linux-2.6.22_lsp.3.0.5

隘路

eglibc 2.5のビルドには、ソースの変更が必要だった。下記パッチを作成:
kernelも、ビルドエラー発生。有名なgetlineの関数定義重複。下記パッチを作成:



ソースの入手先

binutils,
eglibc, http://www.eglibc.org/home,

$ svn co svn://svn.eglibc.org/branches/eglibc-2_5 eglibc-2.5
$ tar jcvf eglibc-2.5.tar.bz2 eglibc-2.5 

kernel, http://opensource.buffalo.jp/ls-ql_r5-102.html

参考

隘路

  • binutils 2.17のビルドでは、makeでエラー発生(2.17aで試すも同じエラー)。binutils 2.32.2を使ったら成功。
  • linux のmake headers_installで、エラー発生:
     scripts/unifdef.c:209: error: conflicting types for ‘getline’
    getline → get_line に変更。
  • eglibc-headersのconfigureで、arm未サポートとなったので、--enable-add-onsに、portsのディレクトリ、nptlを指定。しかし、makeで、TLS supportのエラー発生。
    --enable-add-onsに、portsのソースディレクトリを指定するのではなく、eglibc2.5/libcに、eglibc2.5/portsへのリンクを作成し、--enable-add-onsの引数なしでconfigureしたところ、makeも成功。不思議。。。
  • EGLIBC, Completeで、_beginの定義がないとのエラー発生。
    リンカ周りで発生したエラーの様。最新のbinutils(2.32.2)に対して、gccのバージョンが古い(4.4.5)ためと推測。gccのバージョンを変えて試す:
    gcc 4.4.5 × → 4.8.1 × → 4.6.4 × → 4.6.3 ? →
    (ls-qlのローダ、libcと整合がとれるか不明だが試してみる。)
  • gcc 4.6.4 の gcc1 の configure では、--disable-libquadmath 
  • gcc 4.6 or 4.8のコンパイルで、gmp, mpfr, mpcが必要になる。ソース取得のため、contribで、download_prerequisiteすると、contribにソースが展開される。gcc-4.6.4に、contribに展開されたソースへのリンクを作成したが、×。

Install Transmission

Transmissionをls-qlにインストールする。
最初に、クロスコンパイル環境でビルド、インストールしてみて、上手くいったらls-ql用に再ビルド(--prefix=/usr/localにしてビルド)してパッケージを作成(checkinstall)、ls-qlにパッケージをコピーしてインストール(dpkg -i)する。

Transmissionのクロスコンパイル

バージョンと

transmission-2.82

クロスコンパイル環境でのインストール先

$sysroot/usr/local

準備(変数の設定)

sysroot=~/ls-ql/worktop/arm-built-from-src/sysroot
PATH=$sysroot/tools/bin:$PATH

前提パッケージ、バージョンとインストール先

libevent2 , libevent-2.0.21-stable , $sysroot/usr
zlib , zlib-1.2.8 , $sysroot/usr
openSSL , openssl-1.0.1e , $sysroot/usr/local
curl , curl-7.32.0 , $sysroot/usr/local

libevent2

$./configure --prefix=$sysroot/usr --host=arm-linux-gnueabi --target=arm-l
inux-gnueabi --build=i686-linux-gnueabi
$make
$make install

zlib

$CC=arm-none-linux-gnueabi-gcc LDSHARED="arm-none-linux-gnueabi-gcc -shared -Wl,-soname,libz.so.1" ./configure --prefix=$sysroot/usr --shared
$make -j4
$make prefix=$sysroot/usr install

openSSL

$./Configure --prefix=/usr/local --openssldir=/usr/local/openssl threads zlib shared no-asm linux-armv4
$make -j4
$make INSTALL_PREFIX=$sysroot install

curl

$./configure --host=arm-none-linux-gnueabi --prefix=$sysroot/usr/local OPENSSL_CFLAGS=-I$sysroot/usr/local/include/ OPENSSL_LIBS="-L$sysroot/usr/local/lib/ -lcrypto"
$make
$make install

transmission

$./configure --prefix=$sysroot/usr/local --host=arm-none-linux-gnueabi OPENSSL_CFLAGS=-I$sysroot/usr/local/include/ OPENSSL_LIBS=-lcrypto LIBCURL_CFLAGS=-I$sysroot/usr/loca/include/ LIBCURL_LIBS="-L$sysroot/usr/local/lib/ -lcurl" LIBEVENT_CFLAGS="-I$sysroot/usr/include/" LIBEVENT_LIBS="-L$sysroot/usr/lib/ -levent" --disable-nls --enable-daemon --enable-cli --enable-lightweight
$make
$make install

パッケージ作成

ls-qlへのインストールのために、checkinstall でパッケージを作成する。
transmissionだけでなく、前提パッケージについても、インストール先を、/usr or /usr/local にして、configure ; make ; checkinstall --install=no にて、パッケージを作成する。
sudo checkinstall --install=no
checkinstall の実行時には、 Architectureを、armに変更する:
このパッケージは以下の内容で構成されます:
0 -  Maintainer: [ root@debian ]
1 -  Summary: [ Package created with checkinstall 1.6.2 ]
2 -  Name:    [ transmission ]
3 -  Version: [ 2.82 ]
4 -  Release: [ 1 ]
5 -  License: [ GPL ]
6 -  Group:   [ checkinstall ]
7 -  Architecture: [ arm ]
8 -  Source location: [ transmission-2.82 ]
9 -  Alternate source location: [  ]
10 - Requires: [  ]
11 - Provides: [ transmission ]
12 - Conflicts: [  ]
13 - Replaces: [  ]
結果の確認は、後日。


以上