专注Linux驱动开发、内核研究。
分类: 嵌入式
2015-10-24 00:05:21
去官网下载cygwin的setup.exe,安装步骤比较简单,此处省略。cygwin安装的目录为H:\cygwin,下面提到的根目录即指此目录。
gcc-4.5.0的编译需mpc的支持,而mpc又依赖gmp和mpfr库。
从各个项目官方网站上下载的最新的源码:
binutils-2.22.51-2-src.tar.bz2
gmp-4.3.2-1-src.tar.bz2
mpc-1.0.tar.bz2
mpfr-3.0.1-1-src.tar.bz2
gcc4-4.5.3-3-src.tar.bz2
linux-2.6.32.59.tar.bz2
glibc-2.14.tar.gz
glibc-ports-2.14.tar.gz
由于gcc-4.5.3-3需要mpfr、gmp、mpc的支持,而这三个库又不需要交叉编译,仅仅是在编译交叉编译链时使用,所以放在一个临时的目录。
mkdir –p /cross-root
mkdir –p /build
mkdir –p /build-temp
export PATH=$PATH:/cross-root/bin
mkdir –p /build/gmp
cd /build/gmp
tar -jxf /Packages/release/gmp/gmp-4.3.2-1-src.tar.bz2 -C .
tar –jxf gmp-4.3.2.tar.bz2 –C .
patch –p1 < gmp-4.3.2-1.cygwin.patch
cd gmp-4.3.2
./configure --disable-shared --prefix=/build-temp && make && make install
mkdir –p /build/mpfr
cd /build/mpfr
tar -jxf /Packages/release/mpfr/mpfr-3.0.1-1-src.tar.bz2 -C .
tar -jxf mpfr-3.0.1.tar.bz2 -C .
patch –p1 < mpfr-3.0.1-1.src.patch
patch –p1 < mpfr-3.0.1-1.cygwin.patch
cd mpfr-3.0.1
./configure LDFLAGS="-Wl,-search_paths_first" --disable-shared --with-gmp=/build-temp --prefix=/build-temp && make && make install
cd /build
tar -jxf /Packages/release/mpclib/mpc-1.0.tar.bz2 -C .
cd mpc-1.0
./configure --with-mpfr=/build-temp --with-gmp=/build-temp --disable-shared --prefix=/build-temp && make && make install
cd /build
tar -jxf /Packages/release/binutils/binutils-2.22.51-2-src.tar.bz2 -C .
cd binutils-2.22.51-2
mkdir –p build
cd build
../configure --target=arm-none-linux-gnueabi --prefix=/cross-root --disable-nls && make && make install
mkdir –p /build/gcc
cd /build/gcc
tar -jxf /Packages/release/gcc4/gcc4-4.5.3-3-src.tar.bz2 -C .
tar -jxf gcc-4.5.3.tar.bz2 -C .
patch –p1 < gcc4-4.5.3-3.cygwin.patch
mkdir –p gcc-4.5.3/build
cd gcc-4.5.3/build
../configure --target=arm-none-linux-gnueabi --prefix=/cross-root --disable-nls --disable-shared --without-headers --with-newlib --disable-multilib --disable-decimal-float --disable-threads --disable-libmudflap --disable-libssp --disable-libgomp --enable-languages=c --with-gmp=/build-temp --with-mpfr=/build-temp --with-mpc=/build-temp
make all-gcc all-target-libgcc
make install-gcc install-target-libgcc
cd /cross-root/lib/gcc/arm-none-linux-gnueabi/4.5.3
如果不存在libgcc_eh.a,那么需要手动创建软链接指向libgcc.a
ln –s libgcc.a libgcc_eh.a
cd /build
tar -jxf /Packages/release/linux/linux-2.6.32.59.tar.bz2 -C .
cd linux-2.6.32.59
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- menuconfig
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- headers_install INSTALL_HDR_PATH=dest
cp –a dest/include/* /cross-root/arm-none-linux-gnueabi/include/*
cd /cross-root
mkdir –p usr/
cd usr
ln –s ../arm-none-linux-gnueabi/include include
cd /cross-root/arm-none-linux-gnueabi
mkdir –p usr
cd usr
ln –s ../include include
cd /build
tar -xf /Packages/release/glibc/glibc-2.14.tar.gz -C .
tar -xf /Packages/release/glibc/glibc-ports-2.14.tar.gz -C .
cp -a glibc-ports-2.14/ glibc-2.14/ports
mkdir -p glibc-2.14/build
cd glibc-2.14/build
glibc对arm等的处理器的支持主要通过glibc-ports包来实现;正确认识大小写敏感(case sensitive)和大小写不敏感(case insensitive)系统,大小写敏感问题主要影响到glibc,是交叉编译glibc成功的关键:cygwin帮助手册中可知cygwin是默认大小写不敏感的[7],但是unix系统是大小写敏感的,这也是cygwin和unix类系统的一个区别。
参考网上的旧版本补丁,发现需要将.oS修改为.oST,修改文件主要涉及到Make*,*.mk类型文件。
笔者通过notepad++中的替换功能实现修改,具体操作看如下图:
CC=arm-none-linux-gnueabi-gcc ../configure --host=arm-none-linux-gnueabi --prefix=/cross-root/arm-none-linux-gnueabi --disable-profile --enable-add-ons --enable-kernel=2.6.32.59 --with-headers=/cross-root/arm-none-linux-gnueabi/include --with-binutils=/cross-root/bin libc_cv_forced_unwind=yes libc_cv_c_cleanup=yes
make
make install
cd /build/gcc/gcc-4.5.3/build
make clean
make distclean
rm –rf *
../configure --target=arm-none-linux-gnueabi --prefix=/cross-root --enable-clocale=gnu --enable-threads=posix --enable-__cxa_atexit --enable-c99 --enable-long-long --disable-libstdcxx-pch --disable-libunwind-excaptions --disable-nls --enable-shared --disable-multilib --enable-languages=c,c++ --with-gmp=/build-temp --with-mpfr=/build-temp --with-mpc=/build-temp
make
make install
mkdir –p /build/gdb
cd /build/gdb
mkdir –p gdb_install_dir
tar -jxf /Packages/release/gdb/gdb-7.5.50-1-src.tar.bz2 -C .
cd gdb-7.5.50-1/
mkdir –p build
cd build
../configure --target=arm-none-linux-gnueabi --prefix=/build/gdb/gdb_install_dir --disable-werror
make
make install
编译BFD库:
export PATH=$PATH:/build/cross-root/bin
mkdir –p /build/ binutils-2.22.51_td/ td_install_dir
cd /build/binutils-2.22.51_td
tar -jxf /Packages/release/binutils/binutils-2.22.51-2-src.tar.bz2 -C .
cd binutils-2.22.51-2
mkdir –p build
cd build
CC=arm-none-linux-gnueabi-gcc ../configure --host=arm-none-linux-gnueabi --prefix=/build/binutils-2.22.51_td/td_install_dir --disable-nls
make
make install
拷贝头文件+库文件至交叉编译器的arm-none-linux-gnueabi目录下
cygwin中文件系统是大小写不敏感的,而linux文件系统是大小写敏感的
需要将glibc下面中的*Make*及*.mk类型文件的.oS改为.oST
不能在GCC的源代码目录进行configure,必须在另外的目录进行configure make等工作。所以这里在代码所在目录下mkdir build并cd build再进行../configure等工作
vim ../configure
查找 "$AS --version" 将2.1[3-9] 修改为2.[1-2][0-9]
查找 "$LD --version" 将2.1[3-9] 修改为2.[1-2][0-9]
修改glibc-2.8/elf/Makefile
----e 's/\. = 0 + SIZEOF_HEADERS;/& _begin = . - SIZEOF_HEADERS;/' \
+++-e 's/\. = .* + SIZEOF_HEADERS;/& _begin = . - SIZEOF_HEADERS;/' \
Make-3.82版本不支持隐含和普通规则,分开写即可