构建arm linux gcc 交叉编译器 (上)

前段时间自己动手做了arm的交叉编译器,经过好几天的摸索排错。终于搞定,现将构建过程做一下总结:

一 gcc 3.4.5版本

下载源码包

 

binutils-2.17.tar.gz

linux-2.6.21.tar.gz
gcc-3.4.5.tar.bz2
glibc-2.3.6.tar.gz 
glibc-linuxthreads-2.3.6.tar.gz
假定所在放在目录/home/public/tools下
设置导出2个环境变量
BUILD_DIR=/home/public/tools
export BUILD_DIR
KERNEL=$BUILD_DIR/linux-2.6.21
1.先解压linux-26.21.tar.gz
make ARCH=arm menuconfig  选择你需要配置的内核
保存退出
2.编译安装binutils
先解压 
tar xvzf binutils-2.17.tar.gz
$cd  binutils-2.17
$mkdir arm-linux (不是必须的)
$cd arm-linux 
$../configure --target=arm-linux --prefix=/usr/local /
--with-lib-path=/usr/local/arm-linux/lib:/usr/local/arm-linux/lib/be:/usr/local/arm-linux/lib/soft-float:/usr/local/arm-linux/lib/be/soft-float
$make 
$make install
3 编译gcc c编译器 
这步比较容易出错
首先解压
$tar xvjf gcc-3.4.5.tar.bz2
$cd gcc-3.4.5
$mkdir arm-linux
$patch -p1<$BUILD_DIR/patch/patch-gcc3.4.5-arm
看看补丁
-----------------------------------------------------------------------------------------------------
diff -Nur gcc-3.4.5/gcc/config/arm/linux-elf.h gcc-3.4.5m/gcc/config/arm/linux-elf.h
--- gcc-3.4.5/gcc/config/arm/linux-elf.h 2004-01-31 01:18:40.000000000 -0500
+++ gcc-3.4.5m/gcc/config/arm/linux-elf.h 2009-06-13 03:22:06.000000000 -0400
@@ -55,7 +55,7 @@
    %{shared:-lc} /
    %{!shared:%{profile:-lc_p}%{!profile:-lc}}"
 
-#define LIBGCC_SPEC "%{msoft-float:-lfloat} -lgcc"
+/*#define LIBGCC_SPEC "%{msoft-float:-lfloat} -lgcc"*/
 
 /* Provide a STARTFILE_SPEC appropriate for GNU/Linux.  Here we add
    the GNU/Linux magical crtbegin.o file (see crtstuff.c) which
diff -Nur gcc-3.4.5/gcc/config/arm/t-linux gcc-3.4.5m/gcc/config/arm/t-linux
--- gcc-3.4.5/gcc/config/arm/t-linux 2003-09-20 17:09:07.000000000 -0400
+++ gcc-3.4.5m/gcc/config/arm/t-linux 2009-06-13 03:28:08.000000000 -0400
@@ -1,20 +1,31 @@
-# Just for these, we omit the frame pointer since it makes such a big
-# difference.  It is then pointless adding debugging.
-TARGET_LIBGCC2_CFLAGS = -fomit-frame-pointer -fPIC
+ARGET_LIBGCC2_CFLAGS = -fomit-frame-pointer -fPIC -Dinhibit_libc -D__gthr_posix
 LIBGCC2_DEBUG_CFLAGS = -g0
 
+# Don't build enquire
+ENQUIRE=
+
 LIB1ASMSRC = arm/lib1funcs.asm
-LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx
+LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx /
+ _bb_init_func _call_via_rX _interwork_call_via_rX /
+        _negdf2 _addsubdf3 _muldivdf3 _cmpdf2 _unorddf2 _fixdfsi _fixunsdfsi /
+        _truncdfsf2 _negsf2 _addsubsf3 _muldivsf3 _cmpsf2 _unordsf2 /
+        _fixsfsi _fixunssfsi
+
+MULTILIB_OPTIONS = mlittle-endian/mbig-endian mhard-float/msoft-float
+MULTILIB_DIRNAMES = le be hard-float soft-float
+
+EXTRA_MULTILIB_PARTS = crtbegin.o crtbeginS.o crtend.o crtendS.o crti.o crtn.o
 
-# MULTILIB_OPTIONS = mhard-float/msoft-float
-# MULTILIB_DIRNAMES = hard-float soft-float
+LIBGCC = stmp-multilib
+INSTALL_LIBGCC = install-multilib
+T_CFLAGS = -Dinhibit_libc -D__gthr_posix_h
 
-# If you want to build both APCS variants as multilib options this is how
-# to do it.
-# MULTILIB_OPTIONS += mapcs-32/mapcs-26
-# MULTILIB_DIRNAMES += apcs-32 apcs-26
+# Assemble startup files.
+$(T)crti.o: $(srcdir)/config/arm/crti.asm $(GCC_PASSES)
+ $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(MULTILIB_CFLAGS) $(INCLUDES) /
+ -c -o $(T)crti.o -x assembler-with-cpp $(srcdir)/config/arm/crti.asm
 
-# EXTRA_MULTILIB_PARTS = crtbegin.o crtend.o
+$(T)crtn.o: $(srcdir)/config/arm/crtn.asm $(GCC_PASSES)
+ $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(MULTILIB_CFLAGS) $(INCLUDES) /
+ -c -o $(T)crtn.o -x assembler-with-cpp $(srcdir)/config/arm/crtn.asm
 
-# LIBGCC = stmp-multilib
-# INSTALL_LIBGCC = install-multilib
diff -Nur gcc-3.4.5/gcc/flow.c gcc-3.4.5m/gcc/flow.c
--- gcc-3.4.5/gcc/flow.c 2005-09-01 16:51:09.000000000 -0400
+++ gcc-3.4.5m/gcc/flow.c 2009-06-17 03:59:28.000000000 -0400
@@ -1884,19 +1884,22 @@
   rtx set_src = SET_SRC (pc_set (BB_END (bb)));
   rtx cond_true = XEXP (set_src, 0);
   rtx reg = XEXP (cond_true, 0);
+  enum rtx_code inv_cond;
 
   if (GET_CODE (reg) == SUBREG)
     reg = SUBREG_REG (reg);
 
   /* We can only track conditional lifetimes if the condition is
-     in the form of a comparison of a register against zero.  
-     If the condition is more complex than that, then it is safe
-     not to record any information.  */
-  if (GET_CODE (reg) == REG
+     in the form of a reversible comparison of a register against
+     zero.  If the condition is more complex than that, then it is
+     safe not to record any information.  */
+  inv_cond = reversed_comparison_code (cond_true, BB_END (bb));
+  if (inv_cond != UNKNOWN
+      && GET_CODE (reg) == REG
       && XEXP (cond_true, 1) == const0_rtx)
     {
       rtx cond_false
- = gen_rtx_fmt_ee (reverse_condition (GET_CODE (cond_true)),
+ = gen_rtx_fmt_ee (inv_cond,
   GET_MODE (cond_true), XEXP (cond_true, 0),
   XEXP (cond_true, 1));
       if (GET_CODE (XEXP (set_src, 1)) == PC)
-----------------------------------------------------------------------------------------------
$cd arm-linux
$../configure --target=arm-linux --prefix=/usr/local --disable-shared --disable-threads --disable-libmudflap --disable-$libssp --enable-languages=c  --with-headers=$KERNEL/include  --with-gnu-as --with-gnu-ld --enable-multilib 
$make
$make install
$PATH=$PATH:/usr/local/bin
4 编译 glibc 
解压  
$tar  -xvzf glibc-2.3.6.tar.gz 
$tar -C glibc-2.3.6 -xvzf glibc-linuxthreads-2.3.6.tar.gz
$rm -rf nptl
打上补丁
----------------------------------------------------------------------------
diff -Nur glibc-2.3.6/config.make.in glibc-2.3.6m/config.make.in
--- glibc-2.3.6/config.make.in 2005-07-17 21:38:54.000000000 -0400
+++ glibc-2.3.6m/config.make.in 2009-06-13 03:40:22.000000000 -0400
@@ -11,7 +11,7 @@
 exec_prefix = @exec_prefix@
 datadir = @datadir@
 libdir = @libdir@
-slibdir = @libc_cv_slibdir@
+slibdir = @libdir@
 localedir = @libc_cv_localedir@
 sysconfdir = @libc_cv_sysconfdir@
 libexecdir = @libexecdir@
diff -Nur glibc-2.3.6/configure glibc-2.3.6m/configure
--- glibc-2.3.6/configure 2005-11-03 19:37:15.000000000 -0500
+++ glibc-2.3.6m/configure 2009-06-13 03:42:08.000000000 -0400
@@ -2817,13 +2817,13 @@
   CFLAGS=$ac_save_CFLAGS
 elif test $ac_cv_prog_cc_g = yes; then
   if test "$GCC" = yes; then
-    CFLAGS="-g -O2"
+    CFLAGS="-g -O"
   else
     CFLAGS="-g"
   fi
 else
   if test "$GCC" = yes; then
-    CFLAGS="-O2"
+    CFLAGS="-O"
   else
     CFLAGS=
   fi
@@ -3602,13 +3602,13 @@
   CXXFLAGS=$ac_save_CXXFLAGS
 elif test $ac_cv_prog_cxx_g = yes; then
   if test "$GXX" = yes; then
-    CXXFLAGS="-g -O2"
+    CXXFLAGS="-g -O"
   else
     CXXFLAGS="-g"
   fi
 else
   if test "$GXX" = yes; then
-    CXXFLAGS="-O2"
+    CXXFLAGS="-O"
   else
     CXXFLAGS=
   fi
diff -Nur glibc-2.3.6/Makeconfig glibc-2.3.6m/Makeconfig
--- glibc-2.3.6/Makeconfig 2005-02-16 05:50:19.000000000 -0500
+++ glibc-2.3.6m/Makeconfig 2009-06-13 03:41:37.000000000 -0400
@@ -353,7 +353,7 @@
 # Default flags to pass the C compiler.
 ifndef default_cflags
 ifeq ($(release),stable)
-default_cflags := -g -O2
+default_cflags := -g -O
 else
 default_cflags := -g -O
 endif
@@ -503,12 +503,12 @@
   libunwind = -lunwind
 endif
 ifneq ($(have-as-needed),yes)
- libgcc_eh := -lgcc_eh $(libunwind)
+ libgcc_eh :=  $(libunwind)
 else
  libgcc_eh := -Wl,--as-needed -lgcc_s$(libgcc_s_suffix) $(libunwind) -Wl,--no-as-needed
 endif
 gnulib := -lgcc $(libgcc_eh)
-static-gnulib := -lgcc -lgcc_eh $(libunwind)
+static-gnulib := -lgcc  $(libunwind)
 libc.so-gnulib := -lgcc
 endif
 ifeq ($(elf),yes)
@@ -704,7 +704,7 @@
 # and thus aid debugging, since after all, BPs are a debugging tool.
 object-suffixes += .ob
 CPPFLAGS-.ob = -fbounded-pointers $(pic-default)
-CFLAGS-.ob = -g -O2 -fno-optimize-sibling-calls -fno-strict-aliasing
+CFLAGS-.ob = -g -O -fno-optimize-sibling-calls -fno-strict-aliasing
 libtype.ob = lib%_b.a
 endif
diff -Nur glibc-2.3.6/sysdeps/arm/dl-machine.h glibc-2.3.6m/sysdeps/arm/dl-machine.h
--- glibc-2.3.6/sysdeps/arm/dl-machine.h 2005-10-17 00:52:36.000000000 -0400
+++ glibc-2.3.6m/sysdeps/arm/dl-machine.h 2009-06-17 00:36:14.000000000 -0400
@@ -357,7 +357,8 @@
 #ifdef RESOLVE
 
 /* Deal with an out-of-range PC24 reloc.  */
-static Elf32_Addr
+//static
+ auto inline Elf32_Addr
 fix_bad_pc24 (Elf32_Addr *const reloc_addr, Elf32_Addr value)
 {
   static void *fix_page;
diff -Nur glibc-2.3.6/sysdeps/generic/wordexp.c glibc-2.3.6m/sysdeps/generic/wordexp.c
--- glibc-2.3.6/sysdeps/generic/wordexp.c 2005-02-16 05:56:31.000000000 -0500
+++ glibc-2.3.6m/sysdeps/generic/wordexp.c 2009-06-17 00:46:20.000000000 -0400
@@ -809,7 +809,7 @@
 }
 
 /* Function called by child process in exec_comm() */
-static void
+static inline void
 internal_function __attribute__ ((always_inline))
 exec_comm_child (char *comm, int *fildes, int showerr, int noexec)
 {
diff -Nur glibc-2.3.6/sysdeps/unix/sysv/linux/arm/ioperm.c glibc-2.3.6m/sysdeps/unix/sysv/linux/arm/ioperm.c
--- glibc-2.3.6/sysdeps/unix/sysv/linux/arm/ioperm.c 2003-02-20 17:22:35.000000000 -0500
+++ glibc-2.3.6m/sysdeps/unix/sysv/linux/arm/ioperm.c 2009-06-13 03:39:07.000000000 -0400
@@ -100,8 +100,8 @@
 {
   char systype[256];
   int i, n;
-  static int iobase_name[] = { CTL_BUS, BUS_ISA, BUS_ISA_PORT_BASE };
-  static int ioshift_name[] = { CTL_BUS, BUS_ISA, BUS_ISA_PORT_SHIFT };
+  static int iobase_name[] = { CTL_BUS, CTL_BUS_ISA, BUS_ISA_PORT_BASE };
+  static int ioshift_name[] = { CTL_BUS, CTL_BUS_ISA, BUS_ISA_PORT_SHIFT };
   size_t len = sizeof(io.base);
 
   if (! sysctl (iobase_name, 3, &io.io_base, &len, NULL, 0)
diff -Nur glibc-2.3.6/sysdeps/unix/sysv/linux/bind.S glibc-2.3.6m/sysdeps/unix/sysv/linux/bind.S
--- glibc-2.3.6/sysdeps/unix/sysv/linux/bind.S 2002-05-14 20:17:25.000000000 -0400
+++ glibc-2.3.6m/sysdeps/unix/sysv/linux/bind.S 2009-06-17 00:33:33.000000000 -0400
@@ -2,4 +2,4 @@
 #define NARGS 3
 #define NO_WEAK_ALIAS 1
 #include <socket.S>
-weak_alias (bind, __bind)
+/*weak_alias (bind, __bind)*/
diff -Nur glibc-2.3.6/sysdeps/unix/sysv/linux/getsockname.S glibc-2.3.6m/sysdeps/unix/sysv/linux/getsockname.S
--- glibc-2.3.6/sysdeps/unix/sysv/linux/getsockname.S 2002-05-14 20:17:58.000000000 -0400
+++ glibc-2.3.6m/sysdeps/unix/sysv/linux/getsockname.S 2009-06-17 00:34:01.000000000 -0400
@@ -2,4 +2,4 @@
 #define NARGS 3
 #define NO_WEAK_ALIAS 1
 #include <socket.S>
-weak_alias (getsockname, __getsockname)
+/*weak_alias (getsockname, __getsockname)*/
diff -Nur glibc-2.3.6/sysdeps/unix/sysv/linux/listen.S glibc-2.3.6m/sysdeps/unix/sysv/linux/listen.S
--- glibc-2.3.6/sysdeps/unix/sysv/linux/listen.S 2002-05-14 20:18:37.000000000 -0400
+++ glibc-2.3.6m/sysdeps/unix/sysv/linux/listen.S 2009-06-17 00:34:37.000000000 -0400
@@ -2,4 +2,4 @@
 #define NARGS 2
 #define NO_WEAK_ALIAS 1
 #include <socket.S>
-weak_alias (listen, __listen)
+/*weak_alias (listen, __listen)*/
diff -Nur glibc-2.3.6/sysdeps/unix/sysv/linux/setsockopt.S glibc-2.3.6m/sysdeps/unix/sysv/linux/setsockopt.S
--- glibc-2.3.6/sysdeps/unix/sysv/linux/setsockopt.S 2002-05-14 20:19:09.000000000 -0400
+++ glibc-2.3.6m/sysdeps/unix/sysv/linux/setsockopt.S 2009-06-17 00:34:55.000000000 -0400
@@ -2,4 +2,4 @@
 #define NARGS 5
 #define NO_WEAK_ALIAS 1
 #include <socket.S>
-weak_alias (setsockopt, __setsockopt)
+/*weak_alias (setsockopt, __setsockopt)*/
------------------------------------

i )build arm-linux-little-endian
$mkdir arm-linux 
$cd arm-linux
$CC="arm-linux-gcc" /
AS="arm-linux-as " /
LD="arm-linux-ld " /
../configure  --host=arm-linux --build=i686-pc-linux-gnu --prefix=/usr/local/arm-linux  --libdir=/usr/local/arm-linux/lib --enable-shared --enable-add_ons  --with-headers=$KERNEL/include
$make 
$make install
ii)build arm-linux-big-endian
$mkdir arm-linux-be
$cd arm-linux-be
$CC="arm-linux-gcc -mbig-endian -finline-limit=10000" /
AS="arm-linux-as -mbig-endian" /
LD="arm-linux-ld -EB" /
../configure --host=arm-linux  --build=i686-pc-linux-gnu --prefix=/usr/local/arm-linux --libdir=/usr/local/arm-linux/lib/be --enable-shared --enable-add_ons  --with-headers=$KERNEL/include
$make
$make install 
iii)build arm-linux-little-endian-soft-float
$mkdir arm-linux-s
$cd arm-linux -s
$CC="arm-linux-gcc -msoft-float" /
AS="arm-linux-as " /
LD="arm-linux-ld " /
../configure --target=arm-linux --build=i686-pc-linux-gnu --host=arm-linux   --prefix=/usr/local/arm-linux  --enable-shared --enable-add_ons --without-fp --libdir=/usr/local/arm-linux/lib/soft-float  --with-headers=$KERNEL/include
$make
$make install
iV)build arm-linux-big-endian-soft-float
$mkdir arm-linux-bs 
$CC="arm-linux-gcc -msoft-float" /
AS="arm-linux-as " /
LD="arm-linux-ld " /
../configure --target=arm-linux --build=i686-pc-linux-gnu --host=arm-linux   --prefix=/usr/local/arm-linux  --enable-shared --enable-add_ons --without-fp --libdir=/usr/local/arm-linux/lib/soft-float  --with-headers=$KERNEL/include
$make
$make install
5 建立 full gcc
$cd gcc-3.4.5
$perl -pi -e 's/int namelen/unsigned int namelen/' libjava/java/net/natInetAddressPosix.cc
删除 gcc/config/arm/t-linux gcc-3.4.5m/gcc/config/arm/t-linux中的
-Dinhibit_libc 
$cd arm-linux 
$make clean
$../configure --target=arm-linux --prefix=/usr/local --disable-shared  --with-gnu-as --with-gnu-ld --enable-multilib --with-headers=$KERNEL/include --enable-languages=c,c++ 
$make
$make install
 大功告成
到/usr/local/arm-linux/bin 看看是否有文件生成
未完待续------------

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值