构建arm-linux-gcc-3.4.6交叉编译链

使用环境:Linux Debian 2.6.32-5-amd64 #1 SMP Sun Sep 23 10:07:46 UTC 2012 x86_64 GNU/Linux
一、准备文件

binutils-2.18.tar.bz2   (http://ftp.gnu.org/gnu/)
gcc-3.4.6.tar.gz
glibc-2.3.6.tar.gz
glibc-linuxthreads-2.3.6.tar.bz2
linux-2.6.18.tar.xz

gcc patches:  33_all_pr15068-fix.patch        (http://sources.gentoo.org/cgi-bin/viewvc.cgi/gentoo/src/patchsets/gcc/3.4.6/gentoo/)
glibc patches:5090_all_divdi3-asm-fix.patch     (http://sources.gentoo.org/cgi-bin/viewvc.cgi/gentoo/src/patchsets/glibc/2.3.6/)
       6200_all_arm-glibc-2.3.4-ioperm.patch
            6230_all_arm-glibc-2.3.6-socket-no-weak-alias.patch
       glibc- 2.3.6-libgcc_eh-1.patch          (http://www.linuxfromscratch.org/patches/downloads/glibc/)

注:将源码补丁的内容复制下来保存为文本文件即可

文件存放目录层次关系如下(/表示目录 ||表示文件):
home/user/workspace
              ||binutils-2.18.tar.bz2
              || binutils-2.18a.tar.bz2
              || gcc-3.4.6.tar.gz
              || glibc-2.3.6.tar.gz
              || glibc-linuxthreads-2.3.6.tar.gz
               /patches
                       ||33_all_pr15068-fix.patch
                       ||5090_all_divdi3-asm-fix.patch
                       ||6200_all_arm-glibc-2.3.6-ioperm.patch
                       ||6230_all_arm-glibc-2.3.6-socket-no-weak-lias.patch
                       || glibc-2.3.6-libgcc_eh-1.patch

在user和root的.bashrc都添加以下变量方便稍候的输入

export TARGET=arm- linux                                          // 目标平台
export PREFIX=/usr/local/arm-linux-gcc/3.4.6
export TARGET_PREFIX=$PREFIX/$TARGET              //目标平台库文件
export PATH=$PATH:$PREFIX/bin

二、编译binutils

cd /home/user/workespace/
tar -xvf binutils-2.18.tar.bz2
cd binutils-2.18
./configure --target=$TARGET --prefix=$PREFIX
make
make install
ls $PREFIX/bin

如果可以看到以下文件则说明成功了
arm-linux-addr2line  arm-linux-gprof    arm-linux-objdump    arm-linux-strings
arm-linux-ar           arm-linux-ld       arm-linux-ranlib      arm-linux-strip
arm-linux-as          arm-linux-nm        arm-linux-readelf
arm-linux-c++filt       arm-linux-objcopy     arm-linux-size

二、 编译不带Glibc库支持的gcc
cd /home/user/workspace/
tar -xvf gcc-3.4.6.tar.gz
patch -p1 -d gcc-3.4.6 < patches/33_all_pr15068-fix.patch
cp gcc-3.4.6/gcc/config/arm/t-linux gcc-3.4.6/gcc/config/arm/t-linux.bk

vim gcc-3.4.6/gcc/config/arm/t-linux
改”TARGET_LIBGCC2_CFLAGS = -fomit-frame-pointer –fPIC”
为”TARGET_LIBGCC2_CFLAGS = -fomit-frame- pointer -fPIC -Dinhibit_libc -D__gthr_posix_h”    // 关闭某些需要Glibc支持的特性
cd gcc-3.4.6
mkdir build
cd build
../configure --target=$TARGET --prefix=$PREFIX --disable-threads --disable-shared --enable-languages=c
make
make installd
ls $PREFIX/bin

生成了以下文件:
arm-linux-addr2line  arm-linux-gcc      arm-linux-ld        arm-linux-readelf
arm-linux-ar      arm-linux-gcc-3.4.6    arm-linux-nm       arm-linux-size
arm-linux-as      arm-linux-gccbug      arm-linux-objcopy   arm-linux-strings
arm-linux-c++filt   arm-linux-gcov        arm-linux-objdump  arm-linux-strip
arm-linux-cpp     arm-linux-gprof       arm-linux-ranlib

三、 准备linux-kernel头文件
cd /home/user/workspace/
tar -xvf linux-2.6.18.tar.gz
cd linux-2.6.18

make include/linux/version.h
cp -r include/linux $TARGET_PREFIX/include/linux
cp -r include/asm-generic $TARGET_PREFIX/include/asm-generic
cp -r include/asm-arm $TARGET_PREFIX/include/asm
ls $PREFIX/include
asm  asm-generic  linux

四、 编译glibc
cd /home/user/workspace/
tar -xvf glibc-2.3.6.tar.gz
tar -xvf glibc-linuxthreads-2.3.6.tar.gz  --directory=./glibc-2.3.6
patch -p0 -d glibc-2.3.6 < patches/5090_all_divdi3-asm-fix.patch
patch -p1 -d glibc-2.3.6 < patches/6200_all_arm-glibc-2.3.6-ioperm.patch
patch -p1 -d glibc-2.3.6 < patches/6230_all_arm-glibc-2.3.6-socket-no-weak-lias.patch
patch -p1 -d glibc-2.3.6 < patches/glibc-2.3.6-libgcc_eh-1.patch

ln -s $PREFIX/lib/gcc/arm-linux/3.4.6/libgcc.a  $PREFIX/lib/gcc/arm-linux/3.4.6/libgcc_eh.a

cd glibc-2.3.6
mkdir build
cd build
由于glibc库是用在arm体系的,所以必须使用刚刚生成不支持glibc库的交叉编译链编译。
CC=arm-linux-gcc
../configure --target=$TARGET --prefix=$TARGET_PREFIX --host=$TARGET --enable-add-ons=linuxthreads --enable-shared --with-headers=$TARGET_PREFIX/include
make
出错:
In file included from version.c:33:
/home/user/workspace/build-tools/glibc-2.3.6/build/csu/version-info.h:2: error: missing terminating " character
/home/user/workspace/build-tools/glibc-2.3.6/build/csu/version-info.h:3: error: missing terminating " character
version.c:40: error: syntax error before string constant
make[2]: *** [/home/user/workspace/build-tools/glibc-2.3.6/build/csu/version.o] 错误 1
make[2]: Leaving directory `/home/user/workspace/build-tools/glibc-2.3.6/csu'
make[1]: *** [csu/subdir_lib] 错误 2
make[1]: Leaving directory `/home/user/workspace/build-tools/glibc-2.3.6'
make: *** [all] 错误 2
提示glibc-2.3.6/build/csu/version-info.h文件缺少了一个”
打开version-info.h文件
"Compiled on a Linux >>2.6.32-5-amd64<< system on 2012-06-23.\n"
"Available extensions:
"
" GNU libio by Per Bothner\n"
" crypt add-on version 2.1 by Michael Glad and others\n"
" linuxthreads-0.10 by Xavier Leroy\n"
" BIND-8.2.3-T5B\n"
" libthread_db work sponsored by Alpha Processor Inc\n"
" NIS(YP)/NIS+ NSS modules 0.19 by Thorsten Kukuk\n"
  修改为:
"Compiled on a Linux >>2.6.32-5-amd64<< system on 2012-06-23.\n"
"Available extensions:"
" GNU libio by Per Bothner\n"
" crypt add-on version 2.1 by Michael Glad and others\n"
" linuxthreads-0.10 by Xavier Leroy\n"
" BIND-8.2.3-T5B\n"
" libthread_db work sponsored by Alpha Processor Inc\n"
" NIS(YP)/NIS+ NSS modules 0.19 by Thorsten Kukuk\n"
即第二行的结尾的”被放到第三行了,调整过来即可。
继续...
make
make install

五、 编译带glibc库支持的gcc
cd /home/user/workspace/
rm -rf gcc-3.4.6/gcc/config/arm/t-linux
mv gcc-3.4.6/gcc/config/arm/t-linux.bk  gcc-3.4.6/gcc/config/arm/t-linux
cd gcc-3.4.6/build
rm -rf *
../configure --target=$TARGET --prefix=$PREFIX --enable-multilib --enable-shared --enable-languages=c,c++
make
make install

六、编译gdb

cd /home/user/workspace/
tar -xvf gdb-6.8a.tar.bz2
cd gdb-6.8/
mkdir build
cd build
../configure --target=$TARGET --prefix=$PREFIX
make

错误:
cc1: warnings being treated as errors
http://www.cnblogs.com/gdb/eval.c: In function ‘evaluate_subexp_standard’:
http://www.cnblogs.com/gdb/eval.c:1705: error: ‘subscript_array’ may be used uninitialized in this function
make[2]: *** [eval.o] 错误 1

vim ./gdb/Makefile
修改145行 "WERROR_CFLAGS = -Werror" 为 "WERROR_CFLAGS = #-Werror"即可
继续...

make
make install
大功告成!

原文链接: https://www.cnblogs.com/liu8620/archive/2013/01/07/2848999.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    构建arm-linux-gcc-3.4.6交叉编译链

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/74791

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 下午4:34
下一篇 2023年2月9日 下午4:34

相关推荐