您的位置:首页 > 运维架构 > Linux

构建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]
未完待续------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: