接了个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
人品终于好了点..........