手工从零开始建立ARM交叉编译工具链,并使用Eclipse+J-Link ARM-OB STM32调试S5PV210
一、安装Linux系统,这里推荐Red Hat Enterprise Linux 6.3,服务器系统稳定优先;具体安装过程,请搜索即可,比较简单。
二、下载编译需要的源码包
binutils-2.23.1
expat-2.0.1
gcc-4.7.2
gdb-7.5.1
gmp-5.0.4
mpc-0.8.1
mpfr-2.4.2
newlib-1.20.0(可选)
zlib-1.2.3
glibc-2.17 (可选)
三、安装各种依赖包,因为我这里已经安装很久,都忘记了,不好意思,在运行每个源码包的configure时,如果出错,根据提示用 yum install 命令从网络下载即可;
四、开始编译
1、编译依赖库 GMP,MPFR,EXPAT,ZLIB,MPC
为了省事,直接写了一个sh脚本
export templib=$HOME/ARM/library
mkdir -p $templib
export GMP_VER=5.0.4
export MPFR_VER=2.4.2
export EXPAT_VER=2.0.1
export ZLIB_VER=1.2.3
export MPC_VER=0.8.1
mkdir expat-build
cd expat-build
../expat-$EXPAT_VER/configure \
--prefix=$templib \
--disable-shared
make -j 8
make install
cd ..
cd zlib-$ZLIB_VER
./configure \
--prefix=$templib \
--static
make -j 8
make install
cd ..
mkdir -p gmp-build
cd gmp-build
../gmp-$GMP_VER/configure \
--prefix=$templib \
--disable-shared
make -j 8
make install
rm $templib/lib/*.dylib
cd ..
mkdir -p mpfr-build
cd mpfr-build
../mpfr-$MPFR_VER/configure \
--prefix=$templib \
--disable-shared \
--with-gmp-build=../gmp-build
make -j 8
make install
cd ..
mkdir -p mpc-build
cd mpc-build
../mpc-$MPC_VER/configure \
--prefix=$templib \
--disable-shared \
--enable-static \
--with-gmp=$templib \
--with-mpfr=$templib
make -j 8
make install
cd ..
一般都添加—disable-shared
,--enable-static参数,也修改了安装目录,主要是因为,编译出来的文件仅仅是交叉工具链使用,不必污染PC系统。
make -j 8
这里因为本人笔记本使用4核8线程处理器,就用了多线程编译,加快编译速度,否则后面会让你等得心烦,^_^。
2、编译binutils
binutils 是一些辅助工具集,脚本如下
export target=arm-none-eabi
export prefix=$HOME/ARM/$target
export templib=$HOME/ARM/library
export PATH="$PATHprefix/bin"
export BINUTILS_VER=2.23.1
mkdir -p binutils-build
cd binutils-build
CFLAGS="-I$templib/include" \
LDFLAGS="-L$templib/lib" \
../binutils-$BINUTILS_VER/configure \
--target=$target \
--prefix=$prefix \
--disable-libssp \
--disable-shared \
--disable-threads \
--enable-interwork \
--enable-multilib \
--with-gcc \
--with-gnu-as \
--with-gnu-ld
make -j 8
make install
cd ..
这里一般不会出什么大问题。
3、编译无库GCC,该GCC用于编译各种C库或者linux系统,以编译newlib为例脚本如下:
export target=arm-none-eabi
export prefix=$HOME/ARM/$target
export templib=$HOME/ARM/library
export PATH="$PATHprefix/bin"
export GCC_VER=4.7.2
mkdir -p gcc-build
cd gcc-build
../gcc-$GCC_VER/configure \
--target=$target \
--prefix=$prefix \
--disable-shared \
--disable-threads \
--disable-libssp \
--disable-libmudflap \
--disable-libgomp -v \
--enable-languages=c,c++ \
--enable-interwork \
--enable-multilib \
--with-gcc \
--with-gnu-ld \
--with-gnu-as \
--with-dwarf2 \
--with-newlib \
--with-headers=../newlib-$NEWLIB_VER/newlib/libc/include \
--with-mpc=$templib \
--with-mpfr=$templib \
--with-gmp=$templib \
--with-system-zlib
#--disable-shared 不编译动态链接
#--disable-threads 不支持多线程编译
#--disable-libssp 关闭缓冲溢出
mkdir -p libiberty libcpp fixincludes
make -j8 all-gcc
make install-gcc
cd ..
4、编译newlib
export target=arm-none-eabi
export prefix=$HOME/ARM/$target
mkdir -p $prefix
mkdir -p $templib
export PATH="$PATHprefix/bin"
export NEWLIB_VER=1.20.0
mkdir -p newlib-build
cd newlib-build
mkdir -p etc
../newlib-$NEWLIB_VER/configure \
--target=$target \
--prefix=$prefix \
--disable-newlib-supplied-syscalls \
--enable-interwork \
--enable-multilib
make -j 8
make install
cd ..
5、编译支持newlib的gcc,这里使用3的配置,不过编译目标不一样
export prefix=$HOME/ARM/$target
export PATH="$PATHprefix/bin"
cd gcc-build
make -j8
make install
cd ..
6、编译GDB调试工具,该工具与Jlink的GDBServer链接进行仿真调试;
export target=arm-none-eabi
export prefix=$HOME/ARM/$target
export templib=$HOME/ARM/library
mkdir -p $prefix
mkdir -p $templib
export PATH="$PATHprefix/bin"
export GDB_VER=7.5.1
mkdir -p gdb-build
cd gdb-build
CFLAGS="-I$templib/include" \
LDFLAGS="-L$templib/lib" \
../gdb-$GDB_VER/configure \
--target=$target \
--prefix=$prefix \
--disable-shared \
--disable-threads \
--with-libexpat-prefix=$templib/lib \
--with-libexpat
make -j 8
make install
cd ..
至此,编译完成。
五、下载Eclipse+最新的Jlink驱动并配置
Eclipse下载安装就不用我说了,建议Indigo Service Release 2 版本,界面看起来比较简洁,占用空间较少,4.2就不一样了,工具条各种粗,看起来不舒服……
打开Eclipse->help->install new software
定位到Indigo - http://download.eclipse.org/releases/indigo
搜索debug 安装如图所示的Hardware Debugging,安装完毕后重启Eclipse
OK
六、配置一个工程示例
1、新建一个Cross C 项目
填写工具连路径和前缀
arm-none-eabi-
/home/LiYong/ARM/arm-none-eabi/bin
完成
选中工程,Alt+Enter配置参数,这里增加CPU_TYPE和FPU_TYPE两个环境变量,供后面参数使用
GCC编译器这里替换参数为:
-c -mcpu=${CPU_TYPE} -mfpu=${FPU_TYPE} -marm -fdata-sections -ffunction-sections -fno-builtin -ggdb -gdwarf-2
链接参数:
-mcpu=${CPU_TYPE} -mfpu=${FPU_TYPE} -marm -static -T../${ProjName}.ld -g3 -ggdb -gdwarf-2
汇编器参数:
-x assembler-with-cpp -c -mcpu=${CPU_TYPE} -mfpu=${FPU_TYPE} -marm -Wall -g3 -ggdb -gdwarf-2
OK,配置完毕
六,增加连接器脚本文件,该文件名为 工程名.ld 在工程根目录:
LD脚本文件,主要有两个配置MEMORY和SECTIONS,举例
MEMORY
{
IRAM (rwx) : ORIGIN = 0xD0020000, LENGTH = 85K
}
SECTIONS
{
.text :
{
. = ALIGN(4);
KEEP(*(.text.ResetHandler))
*(.text)
*(.text.*)
. = ALIGN(4);
*(.rodata)
*(.rodata.*)
. = ALIGN(4);
} > IRAM
__INIT_DATA = .;
.data : AT (__INIT_DATA)
{
. = ALIGN(4);
__DATA_BEGIN = .;
*(.data)
*(.data.*)
. = ALIGN(4);
*(.fastrun)
*(.fastrun.*)
. = ALIGN(4);
} > GVAR
__DATA_END = .;
.bss :
{
. = ALIGN(4);
__BSS_BEGIN = .;
*(.bss)
*(.bss.*)
. = ALIGN(4);
} > GVAR
__BSS_END = .;
.VectorTable :
{
. = ALIGN(4);
KEEP(*(.VectorTable))
. = ALIGN(4);
} >VECTOR
}
然后,就可以增减其他编译和调试了,对于M3,M4处理器来说,一般向量表都放在最前面,请将LD脚本中的VectorTable配置正确即可。
|