HOWTO build arm-linux toolchain for ARM/XSCALE

本文档详细介绍了如何构建适用于ARM/XSCALE平台的arm-linux工具链,包括同时支持小端和大端目标库的binutils、gcc及glibc等组件的安装配置过程。

HOWTO build arm-linux toolchain for ARM/XSCALE
----------------------------------------------

These instructions document how to build an arm-linux tool chain
that contains both little-endian and big-endian target libraries.


1. Packages used:

binutils-2.14.tar.gz
gcc-3.3.2.tar.gz
glibc-2.2.5.tar.gz
glibc-linuxthreads-2.2.5.tar.gz

2. binutils-2.14

tar xvzf binutils-2.14.tar.gz
cd binutils-2.14
mkdir xscale_linux_be
cd xscale_linux_be
../configure --target=armbe-linux --prefix=/opt/xscale_linux_be --with-lib-path=/opt/xscale_linux_be/armbe-linux/lib --program-prefix=xscale_linux_be-

make
make install
chmod 777 /opt/xscale_linux_be


3. gcc-3.3.2 -- bootstrap gcc

tar xvzf gcc-3.3.2.tar.gz
cd gcc-3.3.2
cp $(ATTACHED t-linux file) gcc/config/arm/
perl -pi -e 's/GCC_FOR_TARGET = /$/$r//gcc//xgcc /GCC_FOR_TARGET = /$/$r//gcc//xgcc -mbig-endian /g' Makefile.in
cd gcc
perl -pi -e 's/GCC_FOR_TARGET = /.//xgcc /GCC_FOR_TARGET = /.//xgcc -mbig-endian /g' Makefile.in
cd config/arm
perl -pi -e 's/^# MULTILIB_OPTIONS = mlittle-endian//mbig-endian/MULTILIB_OPTIONS += mlittle-endian//mbig-endian/' t-arm-elf
perl -pi -e 's/^# MULTILIB_DIRNAMES = le be/MULTILIB_DIRNAMES += le be/' t-arm-elf
perl -pi -e 's/^# MULTILIB_MATCHES = mbig-endian=mbe mlittle-endian=ml/MULTILIB_MATCHES += mbig-endian=mbe mlittle-endian=ml/' t-arm-elf


export PATH=/opt/xscale_linux_be/bin:/opt/xscale_linux_be/armbe-linux/include:$PATH

mkdir xscale_linux_be
cd xscale_linux_be
../configure --program-prefix=xscale_linux_be- --prefix=/opt/xscale_linux_be --target=armbe-linux --disable-shared --disable-threads --with-headers=/home/john_ho/ixp422/src/snapgear/linux-2.4.x/include --with-gnu-as --with-gnu-ld --enable-multilib --enable-languages=c

perl -pi -e 's/^program_transform_cross_name = s,/^,/$/(target-alias/)-,/program_transform_cross_name = s,/^,xscale_linux_be-,/g' gcc/Makefile
make
make install


4. glibc-2.2.5 (big-endian)

tar xvzf glibc-2.2.5.tar.gz
cd glibc-2.2.5
tar xvzf glibc-linuxthreads-2.2.5.tar.gz

perl -pi -e 's/i386/arm*)/n/tlibc_cv_gcc_unwind_find_fde=yes/n/tarch_minimum_kernel=2.0.10/n/t;;/n i386/' sysdeps/unix/sysv/linux/configure
perl -pi -e 's/weak_alias /(__old_sys_nerr///// $&/' sysdeps/unix/sysv/linux/arm/errlist.c
perl -pi -e 's/weak_alias /(__old_sys_nerr///// $&/' sysdeps/unix/sysv/linux/errlist.c

cd sysdeps/arm
patch -p0 < ../../Patch.armbe-strlen-fix

vi linuxthreads/sysdeps/pthread/pthread.h
- change line 163, "__thread" -> "__thr"
- change line 591, "__thread" -> "__thr"
vi linuxthreads/internals.h
- change line 555, "__thread" -> "__thr"
vi linuxthreads/sysdeps/unix/sysv/linux/bits/sigthread.h
- change line 36, "__thread" -> "__thr"
vi stdio-common/sprintf.c
- line 30, change to "sprintf(char *s, const char *format, ...)"
vi stdio-common/sscanf.c
- line 30, change to "sscanf(const char *s, const char *format, ...)"
vi sysdeps/unix/sysv/linux/arm/sysdep.h
- line 134, remove "a1" from clobber list
vi sysdeps/arm/dl-machine.h
- add '/n/' to end of all macro asm lines (there is a _lot_ of them)

vi config.make.in
- change "slibdir=@...@" to "slibdir=@libdir@"

vi sysdeps/unix/sysv/linux/arm/ioperm.c
- add include file <linux/input.h> to avoid compile error of BUS_ISA not defined.

mkdir xscale_linux_be
cd xscale_linux_be
export CC="xscale_linux_be-gcc -mbig-endian -finline-limit=10000"
export AR="xscale_linux_be-ar"
export RANLIB="xscale_linux_be-ranlib"
export LD="xscale-linux_be-ld -mbig-endian"
../configure armbe-linux --target=armbe-linux --prefix=/opt/xscale_linux_be/armbe-linux --build=i686-pc-linux-gnu --with-headers=/opt/xscale_linux_be/armbe-linux/sys-include --enable-add-ons=linuxthreads --enable-shared
make
make install

6. gcc-3.3.2 (c++, etc) full version

tar xvzf gcc-3.3.2.tar.gz
cd gcc-3.3.2

cp $(ATTACHED t-linux file) gcc/config/arm/
vi gcc/config/arm/t-linux
- remove all "-Dinhibit_libc" occruances

perl -pi -e 's/GCC_FOR_TARGET = /$/$r//gcc//xgcc /GCC_FOR_TARGET = /$/$r//gcc//xgcc -mbig-endian /g' Makefile.in
cd gcc
perl -pi -e 's/GCC_FOR_TARGET = /.//xgcc /GCC_FOR_TARGET = /.//xgcc -mbig-endian /g' Makefile.in
cd config/arm
perl -pi -e 's/^# MULTILIB_OPTIONS = mlittle-endian//mbig-endian/MULTILIB_OPTIONS += mlittle-endian//mbig-endian/' t-arm-elf
perl -pi -e 's/^# MULTILIB_DIRNAMES = le be/MULTILIB_DIRNAMES += le be/' t-arm-elf
perl -pi -e 's/^# MULTILIB_MATCHES = mbig-endian=mbe mlittle-endian=ml/MULTILIB_MATCHES += mbig-endian=mbe mlittle-endian=ml/' t-arm-elf

export PATH=/opt/xscale_linux_be/bin:/opt/xscale_linux_be/armbe-linux/include:$PATH

mkdir xscale_linux_be
cd xscale_linux_be
../configure --program-prefix=xscale_linux_be- --prefix=/opt/xscale_linux_be --target=armbe-linux --enable-multilib --with-headers=/opt/xscale_linux_be/armbe-linux/include --enable-languages=c,c++
perl -pi -e 's/int namelen/unsigned int namelen/' ../libjava/java/net/natInetAddress.cc
[ For big-endian ]
perl -pi -e 's/^CC_FOR_TARGET = /$/$r//gcc//xgcc/CC_FOR_TARGET = /$/$r//gcc//xgcc -mbig-endian /' Makefile
perl -pi -e 's//$/$r//gcc// -nostdinc/+/+ //$/$r//gcc// -nostdinc++ -mbig-endian /' Makefile
cd gcc
perl -pi -e 's/libstdc/+/+ /libstdc/+/+ -mbig-endian /' Makefile

make LDFLAGS="-mbig-endian"
make install

7. gdb-5.1.1

bzip2 -cd gdb-5.1.1.tar.bz2 | tar xvf -
cd gdb-5.1.1
mkdir xscale_linux_be
cd xscale_linux_be
../configure --prefix=/opt/xscale_linux_be --program-prefix=xscale_linux_be- --target=armbe-linux
make
make install

8. cd /
tar cvzf /opt/xscale_linux_be-toolchain-20040511.tar.gz /opt/xscale_linux_be

------------------------------------------------------------------------------

APPENDIX A -- modified t-linux for gcc-3.3.2

------------------------------------------------------------------------------
# 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 -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

# MULTILIB_OPTIONS = mhard-float/msoft-float
# MULTILIB_DIRNAMES = hard-float soft-float
MULTILIB_OPTIONS = mlittle-endian/mbig-endian
MULTILIB_DIRNAMES = le be

# 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

EXTRA_MULTILIB_PARTS = crtbegin.o crtbeginS.o crtend.o crtendS.o crti.o crtn.o

LIBGCC = stmp-multilib
INSTALL_LIBGCC = install-multilib
T_CFLAGS = -Dinhibit_libc -D__gthr_posix_h

# 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

$(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
------------------------------------------------------------------------------

------------------------------------------------------------------------------

APPENDIX B -- Patch.armbe-strlen-fix for glibc-2.2.5

------------------------------------------------------------------------------
--- strlen.S.orig 2003-06-30 14:55:04.000000000 +0200
+++ strlen.S 2003-06-30 14:58:16.000000000 +0200
@@ -53,11 +53,20 @@
ldrne r2, [r1], $4 @ and we continue to the next word
bne Laligned @
Llastword: @ drop through to here once we find a
+#ifdef __ARMEB__
+ tst r2, $0xff000000 @ word that has a zero byte in it
+ addne r0, r0, $1 @
+ tstne r2, $0x00ff0000 @ and add up to 3 bytes on to it
+ addne r0, r0, $1 @
+ tstne r2, $0x0000ff00 @ (if first three all non-zero, 4th
+ addne r0, r0, $1 @ must be zero)
+#else
tst r2, $0x000000ff @ word that has a zero byte in it
addne r0, r0, $1 @
tstne r2, $0x0000ff00 @ and add up to 3 bytes on to it
addne r0, r0, $1 @
tstne r2, $0x00ff0000 @ (if first three all non-zero, 4th
addne r0, r0, $1 @ must be zero)
+#endif
RETINSTR(mov,pc,lr)
END(strlen)
------------------------------------------------------------------------------

<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"><!-- // --></script>

hqyj@ubuntu:~$ echo $ PATH | tr ':' '\n' | grep -E "bin|gcc|arm|aarch" E:-未设置}":~$ echo "CROSS_COMPILE路径: ${CROSS_COMPILE CROSS_COMPILE路径: 未设置 未设置}"ntu:~$ echo "TOOLCHAIN路径: ${TOOLCHAIN_PATH:-TOOLCHAIN路径: 未设置 hqyj@ubuntu:~$ find /usr/bin /usr/local/bin /opt -name "*-gcc" 2>/dev/null /usr/bin/c99-gcc /usr/bin/c89-gcc /usr/bin/x86_64-linux-gnu-gcc /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/sysroots/x86_64-ostl_sdk-linux/usr/bin/arm-ostl-linux/arm-ostl-linux-gcc /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/sysroots/x86_64-ostl_sdk-linux/usr/bin/arm-ostl-linux-gnueabi/arm-ostl-linux-gnueabi-gcc /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/sysroots/x86_64-ostl_sdk-linux/usr/bin/arm-ostl-linux-musleabi/arm-ostl-linux-musleabi-gcc /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/sysroots/x86_64-ostl_sdk-linux/usr/bin/arm-ostl-linux-musl/arm-ostl-linux-musl-gcc /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/sysroots/x86_64-ostl_sdk-linux/usr/share/gcc-arm-none-eabi/bin/arm-none-eabi-gcc /opt/st/fsmp1a/3.1-snapshot/sysroots/x86_64-ostl_sdk-linux/usr/bin/arm-ostl-linux/arm-ostl-linux-gcc /opt/st/fsmp1a/3.1-snapshot/sysroots/x86_64-ostl_sdk-linux/usr/bin/arm-ostl-linux-gnueabi/arm-ostl-linux-gnueabi-gcc /opt/st/fsmp1a/3.1-snapshot/sysroots/x86_64-ostl_sdk-linux/usr/bin/arm-ostl-linux-musleabi/arm-ostl-linux-musleabi-gcc /opt/st/fsmp1a/3.1-snapshot/sysroots/x86_64-ostl_sdk-linux/usr/bin/arm-ostl-linux-musl/arm-ostl-linux-musl-gcc /opt/st/fsmp1a/3.1-snapshot/sysroots/x86_64-ostl_sdk-linux/usr/share/gcc-arm-none-eabi/bin/arm-none-eabi-gcc hqyj@ubuntu:~$ find / -path "*/bin/*-linux-*gcc" 2>/dev/null | grep -E "arm|aarch" /home/hqyj/Downloads/gcc-4.6.4/bin/arm-linux-gcc /home/hqyj/Downloads/gcc-4.6.4/bin/arm-arm1176jzfssf-linux-gnueabi-gcc /home/hqyj/Downloads/gcc-4.6.4/bin/arm-none-linux-gnueabi-gcc /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/sysroots/x86_64-ostl_sdk-linux/usr/bin/arm-ostl-linux/arm-ostl-linux-gcc /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/sysroots/x86_64-ostl_sdk-linux/usr/bin/arm-ostl-linux-gnueabi/arm-ostl-linux-gnueabi-gcc /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/sysroots/x86_64-ostl_sdk-linux/usr/bin/arm-ostl-linux-musleabi/arm-ostl-linux-musleabi-gcc /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/sysroots/x86_64-ostl_sdk-linux/usr/bin/arm-ostl-linux-musl/arm-ostl-linux-musl-gcc /opt/st/fsmp1a/3.1-snapshot/sysroots/x86_64-ostl_sdk-linux/usr/bin/arm-ostl-linux/arm-ostl-linux-gcc /opt/st/fsmp1a/3.1-snapshot/sysroots/x86_64-ostl_sdk-linux/usr/bin/arm-ostl-linux-gnueabi/arm-ostl-linux-gnueabi-gcc /opt/st/fsmp1a/3.1-snapshot/sysroots/x86_64-ostl_sdk-linux/usr/bin/arm-ostl-linux-musleabi/arm-ostl-linux-musleabi-gcc /opt/st/fsmp1a/3.1-snapshot/sysroots/x86_64-ostl_sdk-linux/usr/bin/arm-ostl-linux-musl/arm-ostl-linux-musl-gcc hqyj@ubuntu:~$
最新发布
07-18
<think>我们正在解决两个主要问题: 1. 查找已安装的ARM交叉编译工具链路径(如arm-linux-gcc, arm-none-eabi-gcc等) 2. 设置环境变量(PATH, CROSS_COMPILE, TOOLCHAIN_PATH) 根据引用内容,我们得知: - 交叉编译工具链可以通过系统包管理器安装(如apt-get),也可以手动下载解压安装(引用[1][2][3]) - 安装后需要将工具链的bin目录添加到PATH环境变量中,以便在任何位置使用(引用[1][5]) - 可以通过修改/etc/environment(系统级)或用户profile文件(如~/.bashrc)来设置环境变量(引用[1][5]) - 交叉编译工具链通常包含多个工具,如gcc, g++, ld等,前缀为arm-none-eabi-arm-linux-gnueabihf-等(引用[4]) 因此,我们将分步骤解答: 步骤1:查找已安装的交叉编译工具链路径 方法1:通过包管理器安装的工具链 通常位于/usr/bin,我们可以通过以下命令查找: ls /usr/bin | grep -E 'arm-none-eabi-gcc|arm-linux-gnueabihf-gcc' 或者使用which命令(如果已经在PATH中): which arm-none-eabi-gcc which arm-linux-gnueabihf-gcc 方法2:手动安装的工具链 通常位于用户目录(如~/)或/opt目录下,我们可以使用find命令搜索: find /opt ~/ -type f -name "arm-none-eabi-gcc" 2>/dev/null find /opt ~/ -type f -name "arm-linux-gnueabihf-gcc" 2>/dev/null 方法3:通过系统环境变量PATH查找 echo $PATH | tr ':' '\n' | while read dir; do ls "$dir" | grep -E 'arm-none-eabi-gcc|arm-linux-gnueabihf-gcc' && echo "Found in $dir"; done 步骤2:设置环境变量 一旦找到工具链的路径(假设为/path/to/toolchain/bin),我们需要将其添加到PATH,并设置CROSS_COMPILE和TOOLCHAIN_PATH。 方法1:临时设置(当前终端有效) export PATH=$PATH:/path/to/toolchain/bin export CROSS_COMPILE=arm-none-eabi- # 注意:这里设置的是前缀,并且最后有一个短横线 export TOOLCHAIN_PATH=/path/to/toolchain 方法2:永久设置(用户级) 编辑用户主目录下的.bashrc文件: vim ~/.bashrc 在文件末尾添加: export PATH=$PATH:/path/to/toolchain/bin export CROSS_COMPILE=arm-none-eabi- export TOOLCHAIN_PATH=/path/to/toolchain 然后执行:source ~/.bashrc 方法3:永久设置(系统级,不推荐,除非多用户需要) 编辑/etc/environment(引用[1][5])或/etc/profile(引用[5])文件 注意:修改系统级文件需要sudo权限 例如,在/etc/environment中,修改PATH变量(注意:该文件不是脚本,而是键值对,所以不要加export): PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/path/to/toolchain/bin" 然后添加CROSS_COMPILE和TOOLCHAIN_PATH,在/etc/profile中添加: export CROSS_COMPILE=arm-none-eabi- export TOOLCHAIN_PATH=/path/to/toolchain 然后执行:source /etc/profile 注意:CROSS_COMPILE变量设置的是工具链的前缀,例如如果编译器是arm-none-eabi-gcc,那么前缀就是"arm-none-eabi-"。这样在编译时,makefile会使用$(CROSS_COMPILE)gcc来调用编译器。 步骤3:验证 arm-none-eabi-gcc --version 或 ${CROSS_COMPILE}gcc --version 根据引用[5],在设置环境变量后,需要使用source命令使配置生效。 现在,我们根据用户之前执行过的命令(如find命令)和引用内容,给出具体操作步骤。</think>### 在Ubuntu中查找和配置ARM交叉编译工具链 #### 一、查找已安装的ARM交叉编译工具链路径 1. **通过包管理器安装的工具链** 使用`dpkg`查询已安装的包: ```bash dpkg -L gcc-arm-linux-gnueabihf 2>/dev/null | grep bin/ dpkg -L gcc-arm-none-eabi 2>/dev/null | grep bin/ ``` 典型路径: - ARM32: `/usr/bin/arm-linux-gnueabihf-gcc` - Cortex-M: `/usr/bin/arm-none-eabi-gcc` [^1][^3] 2. **手动安装的工具链** 搜索常见安装位置: ```bash # 搜索系统目录 find /opt ~/ /usr/local -name "*-gcc" 2>/dev/null | grep -E "arm|none-eabi" # 示例输出 /opt/gcc-arm-10.3-2021.07/bin/arm-none-eabi-gcc ~/toolchains/gcc-linaro-7.5.0/bin/arm-linux-gnueabihf-gcc ``` 3. **通过环境变量定位** ```bash # 检查编译器是否在PATH中 which arm-linux-gnueabihf-gcc 2>/dev/null which arm-none-eabi-gcc 2>/dev/null ``` #### 二、设置关键环境变量 1. **PATH变量**(使系统能找到工具链) 编辑`~/.bashrc`(用户级)或`/etc/environment`(系统级): ```bash # 示例:添加ARM工具链到PATH export PATH=$PATH:/opt/gcc-arm-10.3-2021.07/bin ``` 使配置生效:`source ~/.bashrc` [^1][^5] 2. **CROSS_COMPILE变量**(指定工具链前缀) ```bash # ARM32示例 export CROSS_COMPILE=arm-linux-gnueabihf- # Cortex-M示例 export CROSS_COMPILE=arm-none-eabi- ``` 编译时自动组合命令:`${CROSS_COMPILE}gcc` → `arm-linux-gnueabihf-gcc` 3. **TOOLCHAIN_PATH变量**(指定工具链根目录) ```bash export TOOLCHAIN_PATH=/opt/gcc-arm-10.3-2021.07 ``` 在Makefile中使用:`CC = $(TOOLCHAIN_PATH)/bin/$(CROSS_COMPILE)gcc` #### 三、验证配置 ```bash # 检查环境变量 echo "PATH: $PATH" echo "CROSS_COMPILE: ${CROSS_COMPILE:-未设置}" echo "TOOLCHAIN_PATH: ${TOOLCHAIN_PATH:-未设置}" # 测试编译器 ${CROSS_COMPILE}gcc --version ``` 成功输出示例: ``` arm-none-eabi-gcc (GNU Toolchain for ARM Embedded Processors 10.3-2021.07) 10.3.1 20210621 ``` #### 四、工具链切换技巧 创建切换脚本`switch_toolchain.sh`: ```bash #!/bin/bash # 切换到ARM32工具链 export PATH=/usr/bin:$PATH export CROSS_COMPILE=arm-linux-gnueabihf- echo "切换至ARM32工具链" ``` 使用时:`source switch_toolchain.sh` [^2] > **关键提示**: > - 系统级安装(apt)的工具链通常在`/usr/bin` > - 手动安装的工具链建议放在`/opt`或`~/toolchains` > - 永久配置推荐使用`~/.bashrc`避免权限问题 [^5]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值