1 Linux下工作用户及环境
1.1软件环境
Linux ubuntu 6.06 LTS
Kernel version 2.6.15-23-686
gcc version 4.0.3 (Ubuntu 4.0.3-1ubuntu5)
GNU Make 3.81
msgfmt (GNU gettext-tools) 0.14.5
makeinfo (GNU texinfo) 4.8
GNU M4 1.4.4
flex 2.5.31
GNU Awk 3.1.5
perl, v5.8.7
GNU sed version 4.1.4
gettext (GNU gettext-runtime) 0.14.5
autoconf (GNU Autoconf) 2.59
automake (GNU automake) 1.4-p6
1.2 编译相关配置
1. 添加工作用户(在root用户下)
:~# useradd -G root -g root -d/home/arm arm
:~# mkdir -p /home/arm
:~# chown -R arm /home/arm
:~# chmod -R 775 /home/arm
2. 建立工作目录(用arm用户登陆)
mkdir dev_home
cd dev_home
3. 登陆时启动环境变量(用root用户登陆)
:~# vi ~/.bashrc
在.bashrc最后加上
export PATH=/usr/local/arm/3.4.4/bin:$PATH
重新登陆arm用户,环境变量生效
su arm
2. 设置环境变量,准备源码及相关补丁
2.1 设置环境变量
vi ~/.bashrc
export divFIX=/usr/local/arm/3.4.4
export TARGET=arm-linux
export SYSROOT=${divFIX}/sysroot
export ARCH=arm
export CROSS_COMPILE=${TARGET}-
export PATH=${divFIX}/bin:$PATH
export SRC=/home/arm/dev_home/btools/tchain3.4.4
注意: 如果你已经安装过arm-linux-gcc,并且已经加入了环境变量中,将其从环境中去掉保证root用户和arm用户环境中没有arm-linux-gcc
2.2 准备源码包
2.2.1 binutils
名称:binutils-2.16.tar.gz
tar.gz
下载地址:
2.2.2 gcc
名称: gcc-3.4.4.tar.bz2
下载地址:
2.2.3 glibc
名称: glibc-2.3.5.tar.gz
glibc-linuxthreads-2.3.5.tar.gz
下载地址:
2.2.4 linux kernel
名称: linux-2.6.14.1.tar.bz2
下载地址:
2.2.5 gdb
名称: gdb-6.4.tar.gz
下载地址:
2.3 准备补丁
2.3.1 ioperm.c.diff
作用: 打修正ioperm()函数
下载地址:
2.3.2 flow.c.diff
作用: 修改gcc一处bug
下载地址:
2.3.3 t-linux.diff
作用: 该补丁用于产生crti.o和crtn.o文件.
下载地址:
2.4 编译GNU binutils
重新以arm用户登陆,让新设置得环境变量起作用
.
|-- BUILD
|-- binutils-2.16
|-- binutils-2.16.tar.gz
|-- flow.c.diff
|-- gcc-3.4.4
|-- gcc-3.4.4.tar.bz2
|-- gdb-6.4.tar.gz
|-- glibc-2.3.5
|-- glibc-2.3.5.tar.gz
|-- glibc-linuxthreads-2.3.5.tar.gz
|-- ioperm.c.diff
|-- linux-2.6.14.1.tar.bz2
`-- t-linux.diff
su arm
cd ${SRC}
2.5 准备内核头文件
2.5.1 使用当前平台的gcc编译内核头文件
本人是用的CPU是S3C2410,选择了一个配置文件smdk2410_defconfig,你可以根据你的需要选择
System Type --->
ARM system type (Samsung S3C2410) --->
S3C24XX Implementations --->
[ ] Simtec Electronics ANUBIS
[ ] Simtec Electronics BAST (EB2410ITX)
[ ] IPAQ H1940
[ ] Acer N30
[*] SMDK2410/A9M2410
[ ] SMDK2440
[ ] Thorcom VR1000
[ ] HP iPAQ rx3715
[ ] NexVision OTOM Board
[ ] NexVision NEXCODER 2440 Light Board
--- S3C2410 Boot
--- S3C2410 Setup
[ ] S3C2410 DMA support
(0) S3C2410 UART to use for low-level messages
--- Processor Type
--- Processor Features
[*] Support Thumb user binaries
[ ] Disable I-Cache
[ ] Disable D-Cache
[ ] Force write through D-cache
退出时
Do you wish to save your new kernel configuration?
< Yes > < No >
选择Yes
2.5.2 复制内核头文件
2.6 编译glibc头文件
touch ${SYSROOT}/usr/include/bits/stdio_lim.h
2.7 编译gcc 第一阶段
注意: 不能加上--disable-shared
2.8 编译完整的glibc
arm@ubuntu:~/dev_home/btools/tchain3.4.4/BUILD/glibc-2.3.5$ BUILD_CC=gcc CC=${CROSS_COMPILE}gcc AR=${CROSS_COMPILE}ar RANLIB=${CROSS_COMPILE}ranlib AS=${CROSS_COMPILE}as LD=${CROSS_COMPILE}ld ../../glibc-2.3.5/configure --divfix=/usr --build=i386-ubuntu-linux --host=arm-unknown-linux-gnu --target=arm-unknown-linux-gnu --without-__thread --enable-add-ons=linuxthreads --with-headers=${SYSROOT}/usr/include
说明:
--divfix: 指定安装路径。
正在装载数据……
--target: 指定目标平台。
--host: 指定当前平台。
--build: 指定编译平台。
--with-sysroot: 用于指定编译所需要的头文件,及链接库。
--enable-add-ons: 加入其它的库,如线程库等。
--enable-languages: 指定gcc所支持的语言。
2.9 编译完整的gcc
Reading specs from /usr/local/arm/3.4.4/lib/gcc/arm-linux/3.4.4/specsConfigured with: ../../gcc-3.4.4/configure --divfix=/usr/local/arm/3.4.4 --target=arm-linux --with-sysroot=/usr/local/arm/3.4.4/sysroot --disable-nls --enable-threads=posix --enable-symvers=gnu --enable-__cxa_atexit --with-softfloat-support=internal --enable-languages=c,c --enable-shared --enable-c99 --enable-long-long
Thread model: posix
gcc version 3.4.4
tree -L 1
.
|-- arm-linux
|-- bin
|-- include
|-- info
|-- lib
|-- libexec
|-- man
|-- share
`-- sysroot
du -sh
193M .
ls
arm-linux-addr2line arm-linux-c filt arm-linux-gcc-3.4.4 arm-linux-nm arm-linux-readelf
arm-linux-ar arm-linux-cpp arm-linux-gccbug arm-linux-objcopy arm-linux-size
arm-linux-as arm-linux-g arm-linux-gcov arm-linux-objdump arm-linux-strings
arm-linux-c arm-linux-gcc arm-linux-ld arm-linux-ranlib arm-linux-strip
2.10 测试gcc,g
vi hello_c.c
#include
#include
int main()
{
printf("Hello,World~\n");
return 0;
}
vi hello_cpp.cpp
#include
using std::cout;
using std::endl;
int main()
{
cout<<"Hello,World!\n"<
return 0;
}
arm-linux-gcc hello_c.c -o hello_c
arm-linux-g -o hello_cpp hello_cpp.cpp
tree -L 1
.
|-- dev_home
|-- hello_c
|-- hello_c.c
|-- hello_cpp
`-- hello_cpp.cpp
1 directory,4 files
file hello_c
hello_c: ELF 32-bit LSB executable, ARM, version 1 (ARM), for GNU/Linux 2.0.0, dynamically linked (uses shared libs), for GNU/Linux 2.0.0, not stripped
file hello_cpp
hello_cpp: ELF 32-bit LSB executable, ARM, version 1 (ARM), for GNU/Linux 2.0.0, dynamically linked (uses shared libs), for GNU/Linux 2.0.0, not stripped
2.11 编译主机上运行的gdb
gdb/gdb: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.0, dynamically linked (uses shared libs), for GNU/Linux 2.2.0, not stripped
2.12建立目标平台上运行的gdbserver
gdbserver: ELF 32-bit LSB executable, ARM, version 1 (ARM), for GNU/Linux 2.0.0, dynamically linked (uses shared libs), for GNU/Linux 2.0.0, not stripped
3 GNU交叉工具链的下载
工具链的官方下载地址:
可以从该站点下载2.95.3, 3.0以及3.2工具链
文章转载自『幽月's Blog』地址:
阅读(2407) | 评论(0) | 转发(0) |