构建arm linux gcc 交叉编译器 (上)
2010-07-01 20:00
239 查看
前段时间自己动手做了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
[b]删除 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 看看是否有文件生成
[/b]
未完待续------------
一 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
[b]删除 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 看看是否有文件生成
[/b]
未完待续------------
相关文章推荐
- 构建arm linux gcc 交叉编译器 (下) gcc v4
- ubuntu 下交叉编译器arm-linux-gcc-4.3.2.tar.tgz的安装
- Ubuntu 12.04版本下安装交叉编译器arm-linux-gcc4.3.2
- ubuntu 12.04 交叉编译器(arm-linux-gcc-4.4.3)
- ubuntu12.10安装交叉编译器arm-none-linux-gnueabi-gcc
- arm-linux-gcc交叉编译器和gcc编译器的下载地址
- CentOS安装arm-linux-gcc交叉编译器
- ubuntu 12.04交叉编译器(arm-linux-gcc-4.4.3)
- arm-Linux-gcc-4.3.2 交叉编译器的安装
- 64位ubuntu14.04安装交叉编译器arm-linux-gcc出现没有那个文件或目录
- 【linux】交叉编译器arm-linux-gcc
- 交叉编译器arm-linux-gcc-4.4.3安装
- 使用Crosstool 0.43 在ubuntu0.94上制作arm交叉编译器arm-linux-gcc
- arm-linux-gcc交叉编译器的安装与配置
- arm-linux-gcc交叉编译器和gcc编译器的下载地址
- 安装arm-linux-gcc交叉编译器
- Ubuntu 12.04安装交叉编译器arm-none-linux-gnueabi-gcc arm-linux-gcc
- (转)交叉编译器arm-linux-gcc 收藏
- centos7安装arm-linux-gcc-4.4.3交叉编译器
- 在centos7测试arm-Linux-gcc交叉编译器