Chinaunix首页 | 论坛 | 博客
  • 博客访问: 42373
  • 博文数量: 4
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 7
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-23 21:52
个人简介

专注Linux驱动开发、内核研究。

文章分类
文章存档

2015年(3)

2014年(1)

我的朋友

分类: 嵌入式

2015-10-24 00:05:21

1       cygwin的安装

去官网下载cygwin的setup.exe,安装步骤比较简单,此处省略。cygwin安装的目录为H:\cygwin,下面提到的根目录即指此目录。


2       arm交叉编译环境的构建

2.1      源码准备

 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


2.2      构建过程详解

2.2.1 非交叉编译安装gcc支持包gmp

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

 

2.2.2 非交叉编译安装gcc支持包mpfr

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

 

2.2.3 非交叉编译安装gcc支持包mpc

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

 

2.2.4 交叉编译安装binutils

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

 

2.2.5 建立用于编译C库的gcc

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

 

2.2.6 配置内核生成必要的头文件

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

 

2.2.7 编译C

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

 

 

2.2.8 编译完整的gcc工具链

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


2.2.9 编译gdb

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


2.2.10 编译第三方库

编译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目录下


2.3      编译过程中遇到的问题

2.3.1 ‘librtld.os: In function `process_envvars'’打印错误

cygwin中文件系统是大小写不敏感的,而linux文件系统是大小写敏感的

需要将glibc下面中的*Make*及*.mk类型文件的.oS改为.oST


2.3.2 ‘libgcc.mvars: No such file or directory’打印错误

不能在GCC的源代码目录进行configure,必须在另外的目录进行configure make等工作。所以这里在代码所在目录下mkdir build并cd build再进行../configure等工作


2.3.3 ‘These critical programs are missing or too old: as ld’打印错误

vim ../configure

 查找 "$AS --version" 将2.1[3-9] 修改为2.[1-2][0-9]

 查找 "$LD --version" 将2.1[3-9] 修改为2.[1-2][0-9]


2.3.4 ‘librtld.os: In function `_dl_start_final'’打印错误

修改glibc-2.8/elf/Makefile

----e 's/\. = 0 + SIZEOF_HEADERS;/& _begin = . - SIZEOF_HEADERS;/' \

+++-e 's/\. = .* + SIZEOF_HEADERS;/& _begin = . - SIZEOF_HEADERS;/' \


2.3.5 ‘Makefile:235: *** 混和的隐含和普通规则打印错误

Make-3.82版本不支持隐含和普通规则,分开写即可


阅读(3354) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~