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に展開されたソースへのリンクを作成したが、×。

0 件のコメント: