在 Fedora 13 上制作 ARM linux gcc 交叉编译环境
作者 :solarnumen
前提,先使用下载的GCC 相关包 升级完本机的 GCC,否则 后面会出现错误:
link tests are not allowed after gcc_no_executables.
----------------------------------------------------------------------------------------------------------------------------------------------
0.准备GCC相关包
binutils-2.20.1.tar.bz2
gcc-4.5.1.tar.bz2
glibc-2.12.1.tar.bz2
linux kernel(暂时手上只有linux-2.6.24.tar.gz)
binutils-2.20-2.20.1-patch
gcc-4.5.1-startfiles_fix-1.patch
glibc-2.12.1-gcc_fix-1.patch
glibc-2.12.1-makefile_fix-1.patch
1.在 F13 上创建制作环境
设置环境变量
修改 ~/.bash_profile
export PRJROOT=/home/embedded
export TARGET=arm-linux
export PREFIX=${PRJROOT}/tools
export TARGET_PREFIX=${PREFIX}/${TARGET}
export PATH=${PREFIX}/bin:${PATH}
创建制作目录
mkdir /home/embedded
mkdir /home/embedded/build-tools
mkdir /home/embedded/kernel
mkdir /home/embedded/tools
mkdir /home/embedded/build-tools/build-binutils
mkdir /home/embedded/build-tools/build-gcc
mkdir /home/embedded/build-tools/build-glibc
mkdir /home/embedded/build-tools/glibc
mkdir /home/embedded/tools/arm-linux
mkdir /home/embedded/tools/arm-linux/include
mkdir /home/embedded/tools/include
展开文件到目录
binutils-2.20.1.tar.bz2 到 /home/embedded/build-tools/build-binutils
binutils-2.20-2.20.1-patch.gz 到 /home/embedded/build-tools/build-binutils
gcc-4.5.1.tar.bz2 到 /home/embedded/build-tools/
gcc-4.5.1-startfiles_fix-1.patch 到 /home/embedded/build-tools/
glibc-linuxthreads-2.5.tar.bz2 到 /home/embedded/build-tools/glibc
glibc-2.12-branch-update-20100613.patch 到 /home/embedded/build-tools/glibc
glibc-2.12.1-makefile_fix-1.patch 到 /home/embedded/build-tools/glibc
glibc-2.12.1-gcc_fix-1.patch 到 /home/embedded/build-tools/glibc
linux-2.6.24.tar.gz) 到 mkdir /home/embedded/kernel
进入到 linux-2.6.24 拷贝头文件
cd /home/embedded/kernel/linux-2.6.24
cp -dR include/linux /home/embedded/tools/arm-linux/include
cp -dR include/asm-arm /home/embedded/tools/arm-linux/include/asm
进入到制作环境
su -
编译生成kernel version头文件
cd /home/embedded/kernel/linux-2.6.24
这个是编译glibc时必须的,使用命令:make include/linux/version.h
2.编译安装binutils
为 binutils-2.20.1
打补丁文件 binutils-2.20-2.20.1-patch
cd /home/embedded/build-tools/build-binutils/binutils-2.20.1
patch -Np1 -i ../binutils-2.20-2.20.1-patch
../binutils-2.20.1/configure --target=$TARGET --prefix=$PREFIX --enable-kernel=2.6.24
make
make install
3.编译安装gcc 的c 编译器
为 gcc-4.5.1
打补丁文件 gcc-4.5.1-startfiles_fix-1.patch
cd /home/embedded/build-tools/build-gcc/gcc-4.5.1
patch -Np1 -i ../gcc-4.5.1-startfiles_fix-1.patch
修改 /home/embedded/build-tools/build-gcc/gcc-4.5.1/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
../gcc-4.5.1/configure --target=$TARGET --prefix=$PREFIX --without-headers --enable-languages=c --disable-threads --disable-shared --enable-kernel=2.6.24
make all-gcc
make install-gcc
再编译安装libgcc,这个是后面编译glibc必须的。
编译:
make all-target-libgcc
安装libgcc:
make install-target-libgcc
------------------------------------
解决 cannot find -lgcc 使用 --disable-shared
使用了--disable-shared的选项,将不会生成libgcc_eh.a,可以通过对libgcc.a的链接来实现
如果不使用--disable-shared ,后面将报错误:
crti.o: No such file: No such file or directory
/home/embedded/tools/lib/gcc/arm-linux/4.5.1/../../../../arm-linux/bin/ld: cannot find -lgcc
----------------------------------------------------
解决 cannot find -lgcc_eh 不使用 --disable-shared
../gcc-4.5.1/configure --target=$TARGET --prefix=$PREFIX --without-headers --enable-languages=c --disable-threads
make all-target-libgcc
这个过程会报错,但会生成 libgcc_eh.a $PRJROOT/tools/lib/gcc/arm-linux/4.5.1/
把 libgcc_eh.a 复制到
cp $PRJROOT/build-tools/build-gcc/arm-linux/libgcc/libgcc_eh.a $PRJROOT/tools/lib/gcc/arm-linux/4.5.1/
4.建立 C 库 (glibc)
打补丁后
进入文件夹build-glibc,创建 config.cache 文件,并且在文件中输入以下内容
echo libc_cv_forced_unwind=yes >config.cache
echo libc_cv_c_cleanup=yes >>config.cache
echo libc_cv_arm_tls=yes >>config.cache
echo libc_cv_broken_visibility_attribute=no
echo libc_cv_visibility_attribute=yes
修改/home/embedded/build-tools/glibc-2.12.1/ports/sysdeps/arm/dl-machine.h 文件
#define VALID_ELF_ABIVERSION(ver) (ver == 0)
#define VALID_ELF_OSABI(osabi)
(osabi == ELFOSABI_SYSV || osabi == ELFOSABI_ARM)
#define VALID_ELF_HEADER(hdr,exp,size)
memcmp (hdr,exp,size-2) == 0
&& VALID_ELF_OSABI (hdr[EI_OSABI])
&& VALID_ELF_ABIVERSION (hdr[EI_ABIVERSION])
#define CLEAR_CACHE(BEG,END)
INTERNAL_SYSCALL_ARM (cacheflush, , 3, (BEG), (100498266, END), 0)
为
#ifndef VALID_ELF_ABIVERSION
#define VALID_ELF_ABIVERSION(ver) (ver == 0)
#endif
#ifndef VALID_ELF_OSABI
#define VALID_ELF_OSABI(osabi)
(osabi == ELFOSABI_SYSV || osabi == ELFOSABI_ARM)
#endif
#ifndef VALID_ELF_HEADER
#define VALID_ELF_HEADER(hdr,exp,size)
memcmp (hdr,exp,size-2) == 0
&& VALID_ELF_OSABI (hdr[EI_OSABI])
&& VALID_ELF_ABIVERSION (hdr[EI_ABIVERSION])
#endif
#ifndef CLEAR_CACHE
#define CLEAR_CACHE(BEG,END)
INTERNAL_SYSCALL_ARM (cacheflush, , 3, (BEG), (100498266, END), 0)
#endif
CC=arm-linux-gcc AR=arm-linux-ar RANLIB=arm-linux-ranlib ../glibc-2.12.1/configure --host=$TARGET --target=$TARGET --prefix=$TARGET_PREFIX --enable-add-ons --with-headers=$TARGET_PREFIX/include --cache-file=config.cache --enable-kernel=2.6.24
make
make install_root=$TARGET_PREFIX prefix="" install
修改 $PRJROOT/tools/arm-linux/lib/libc.so:
用vi或gedit打开libc.so文件,将文件中的:
GROUP ( /lib/libc.so.6 /lib/libc_nonshared.a AS_NEEDED ( /lib/ld-linux.so.2 ) )
更改为
GROUP ( libc.so.6 libc_nonshared.a )
保存后退出
5.创建完整的 gcc
cd $PRJROOT/build-tools/build-gcc
../gcc-4.5.1/configure --target=$TARGET --prefix=$PREFIX --enable-languages=c,c++ --with-headers=$PREFIX/include --disable-libgomp --enable-kernel=2.6.24
make all
make install
-----------------------------------------------------------------------------
如果不出现意外,应该一切OK
arm-linux-gdb/arm-linux-gdbserver
-----------------------------------------------------------------------------
编译gdb
CC=gcc ../gdb-7.2/configure --target=$TARGET --prefix=$PREFIX
make
make install
编译gdbserver
进入gdb-XX/gdb/gdbserver/目录下:
CC=arm-linux-gcc ../gdb-7.2/gdb/gdbserver/configure --host=$TARGET --target=$TARGET --prefix=$PREFIX
make(生成gdbserver在当前目录下)
检查编译完的gdbserver是否是for arm平台:执行file
gdbserver是否看到ELF 32-bit LSB executable, ARM, version 1,
dynamically linked (uses shared libs), for GNU/Linux 2.0.0, not stripped
把gdbserver烧到arm板上
编译gdbserver时出现PATH_MAX undeclared错误的解决方法:
在hostio.c文件中增加
在../gdb-7.2/gdb/gdbserver/thread-db.c 文件中增加
#include <linux/limits.h>
原因是宏PATH_MAX在<limits.h>中没有定义,而是定义在<linux/limits.h>中