1. 程式人生 > >cygwin上編譯arm-linux gcc-3.4.4 glibc-2.3.5

cygwin上編譯arm-linux gcc-3.4.4 glibc-2.3.5

接了個GM8182 DVR的案子,在原廠提供的SDK基礎上做些AVI錄影管理和RTSP流服務,還有跟以前開發的推送平臺的整合。

智源提供了arm-linux-2.6.14 和 gcc-3.4.4-glibc-2.3.5, 都是在linux的。


以前一直用vmware跑ubuntu還蠻順的。前一段時間裝了一堆亂七八糟的開發環境,一開vmware爆卡無比。

覺得用cygwin會更方便點,花了點時間把環境遷移到cygwin上。


交叉編譯gcc-3.4.4的資訊網路上是多得是在不能在多了,不過在cyginw上做還是有點差異的。遇到以下兩個問題:

1、cygwin上binutils的版本過高,通過修稿configure的version check 解決

2、winxp上的檔案系統是大小寫無關的,編譯glibc時會有問題,可以修改登錄檔使得cygwin下的檔案大小寫敏感

3、glibc-2.3.5/manual/Makefile 不被cygwin 的 gnumake支援, 修改之


a】下載程式碼包


下載binutils-2.16.tar.gz

http://ftp.gnu.org/gnu/binutils/binutils-2.16.tar.gz


下載glibc-2.3.5.tar.gz 和 glibc-linuxthreads-2.3.5.tar.gz

http://ftp.gnu.org/gnu/glibc/glibc-2.3.5.tar.gz

http://ftp.gnu.org/gnu/glibc/glibc-linuxthreads-2.3.5.tar.gz


下載gcc-3.4.4

http://ftp.gnu.org/gnu/gcc/gcc-3.4.4/gcc-3.4.4.tar.bz2


下載三個補丁

http://frank.harvard.edu/~coldwell/toolchain/ioperm.c.diff

http://frank.harvard.edu/~coldwell/toolchain/t-linux.diff

http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/flow.c.diff?cvsroot=gcc&only_with_tag=csl-arm-branch&r1=1.563.4.2&r2=1.563.4.3


b】目錄說明:

1、以上下載的檔案放置在  /home/eric/crosstools/gm818x/package 下

2、編譯的工作目錄在  /home/eric/crosstools/gm818x/BUILD  下

3、生成的目標目錄在  /home/eric/crosstools/gm818x/3.4.4 下

4、程式碼檔案解壓到  /home/eric/crosstools/gm818x/ 下

5、幹完這炮打掃戰場


c】第一階段:


編譯binutils-2.16 

    #tar zxvf package/binutils-2.16.tar.gz

    #mkdir -p BUILD/binutils-2.16

    #pushd BUILD/binutils-2.16

    #../../binutils-2.16/configure --prefix=/home/eric/crosstools/gm818x/3.4.4 --target=arm-linux --with-sysroot=/home/eric/crosstools/gm818x/3.4.4/sysroot

    #make 

    #make install

    #export PATH=$PATH:/home/eric/crosstools/gm818x/3.4.4//bin

    #popd


拷貝linux kernel 標頭檔案

    #mkdir -p /home/eric/crosstools/gm818x/3.4.4/usr/include

    在ubuntu中編譯 arm-linux-2.6.14-fa

    拷貝如下目錄到cygwin的 /home/eric/crosstools/gm818x/3.4.4/usr/include 目錄下

        arm-linux-2.6.14-fa/include/linux

        arm-linux-2.6.14-fa/include/asm-arm

        arm-linux-2.6.14-fa/include/asm-generic

        arm-linux-2.6.14-fa/include/asm

    注意 asm 是 asm-arm的軟連結,


編譯glibc-2.3.5-headers

    #tar jxvf package/glibc-2.3.5.tar.bz2

    #patch -d glibc-2.3.5 -p1 < package/ioperm.c.diff

    #pushd glibc-2.3.5

    #tar zxvf ../package/glibc-linuxthreads-2.3.5.tar.gz

    #popd

    修改glibc-2.3.5/configure 

        Line 3920:   2.1[3-9]*)   -->   2.[1-2][1-9]*)

        Line 3981:   2.1[3-9]*)   -->   2.[1-2][1-9]*)

        ps:  cygwin的as和ld是2.22 之後第二階段編譯glibc時檢查的是上一步編譯的arm-linux-as 和arm-linux-ld(2.16)

   修改glibc-2.3.5/manual/Makefile

        LINE 236 : $(objpfx)stubs ../po/manual.pot $(objpfx)stamp%: 一行內三個目標拆分成三個目標分別$(make-target-directory)

    #mkdir -p BUILD/glibc-2.3.5-headers

    #pushd BUILD/glibc-2.3.5-headers

    #../../glibc-2.3.5/configure --prefix=/usr --host=arm-linux --enable-add-ons=linuxthreads --with-headers=/home/eric/crosstools/gm818x/3.4.4/sysroot/usr/include

    #make cross-compiling=yes install_root=/home/eric/crosstools/gm818x/3.4.4/sysroot install-headers

    #touch /home/eric/crosstools/gm818x/3.4.4/sysroot/usr/include/gnu/stubs.h

    #touch /home/eric/crosstools/gm818x/3.4.4/sysroot/usr/include/bits/stdio_lim.h

    #popd


編譯gcc-3.4.4

    #tar jxvf package/gcc-3.4.4.tar.bz2

    #patch -d gcc-3.4.4 -p1 < package/flow.c.diff

    #patch -d gcc-3.4.4 -p1 < package/t-linux.diff

    #mkdir -p BUILD/gcc-3.4.4-stage1

    #pushd BUILD/gcc-3.4.4-stage1

    #../../gcc-3.4.4/configure --prefix=/home/eric/crosstools/gm818x/3.4.4 --target=arm-linux --enable-languages=c --with-sysroot=/home/eric/crosstools/gm818x/3.4.4/sysroot

    #make all-gcc

    #make install-gcc

    #popd


d】第二階段:


編譯完整的glibc-2.3.5

    #mkdir -p BUILD/glibc-2.3.5

    #pushd BUILD/glibc-2.3.5

    #BUILD_CC=gcc CC=arm-linux-gcc AR=arm-linux-ar RANLIB=arm-linux-ranlib AS=arm-linux-as LD=arm-linux-ld ../../glibc-2.3.5/configure --prefix=/usr --build=i686-pc-cygwin --host=arm-unknown-linux-gnu --target=arm-unknown-linux-gnu --without-__thread --enable-add-ons=linuxthreads --with-headers=/home/eric/crosstools/gm818x/3.4.4/sysroot/usr/include

    #make install_root=$SYSROOT all

    #make install_root=$SYSROOT install 

    #popd

    沒有 make all 就直接make install 會一直2在libdl.so.2上

    ps: 木有修改cygwin的檔案系統大小寫敏感,該步驟會傻逼掉。

           木有新增/home/eric/crosstools/gm818x/3.4.4//bin到PATH變數中會提示找不到arm-linux-nm 和 arm-linux-ar


編譯完成gcc-3.4.4

    #mkdir -p BUILD/gcc-3.4.4

    #pushd BUILD/gcc-3.4.4

    #../../gcc-3.4.4/configure --prefix=/home/eric/crosstools/gm818x/3.4.4 --target=arm-linux  --with-sysroot=/home/eric/crosstools/gm818x/3.4.4/sysroot --with-headers=/home/eric/crosstools/gm818x/3.4.4/sysroot/usr/include --disable-nls --enable-threads=posix --enable-symvers=gnu --enable-__cxa_atexit --with-softfloat-support=internal --enable-languages=c,c++ --enable-shared --enable-c99 --enable-long-long

    #make 

    #make install



人品終於好了點..........