Linux环境下的GCC工具链详解,GNU交叉工具链(arm-linux-gcc3.4.4)

本文详细介绍了如何在Ubuntu系统下为ARM架构创建交叉编译工具链的过程,包括用户添加、环境变量设置、软件源码下载、补丁应用以及各组件(如binutils、gcc、glibc)的编译步骤。最后验证了gcc和gdb的编译结果,确保工具链的正确性。
摘要由CSDN通过智能技术生成

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}

arm@ubuntu:~/dev_home/btools/tchain3.4.4/BUILD/binutils-2.16$ ../../binutils-2.16/configure --divfix=${divFIX} --target=${TARGET} --with-sysroot=${SYSROOT}

2.5 准备内核头文件

2.5.1 使用当前平台的gcc编译内核头文件

arm@ubuntu:~/dev_home/kernel$ tar jxvf ../btools/tchain3.4.4/linux-2.6.14.1.tar.bz2

arm@ubuntu:~/dev_home/kernel/linux-2.6.14.1$ cp arch/arm/configs/smdk2410_defconfig .config

本人是用的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 复制内核头文件

root@ubuntu:/home/arm/dev_home/kernel/linux-2.6.14.1# cp -a include/asm-generic ${SYSROOT}/usr/include/asm-generic

2.6 编译glibc头文件

arm@ubuntu:~/dev_home/btools/tchain3.4.4/BUILD/glibc-2.3.5-headers$ ../../glibc-2.3.5/configure --divfix=/usr --host=${TARGET} --enable-add-ons=linuxthreads --with-headers=${SYSROOT}/usr/include

touch ${SYSROOT}/usr/include/bits/stdio_lim.h

2.7 编译gcc 第一阶段

arm@ubuntu:~/dev_home/btools/tchain3.4.4/BUILD/gcc-3.4.4-stage1$ ../../gcc-3.4.4/configure --divfix=${divFIX} --target=${TARGET} --enable-languages=c --with-sysroot=${SYSROOT}

注意: 不能加上--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

arm@ubuntu:~/dev_home/btools/tchain3.4.4/BUILD/gcc-3.4.4$../../gcc-3.4.4/configure --divfix=${divFIX} --target=${TARGET} --with-sysroot=${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

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<

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』地址:

阅读(2124) | 评论(0) | 转发(0) |

0

下一篇:酷睿

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值