我需要一个明确的答案,因为我还不清楚,而且我在文档中找不到明确的答案。
假设我有一个工作的gcc
工具链,其中
host x86_64-linux-gnu
target x86_64-linux-gnu
,问题是我是否可以从具有的源配置和构建gcc
?
host x86_64-linux-gnu
build x86_64-linux-gnu
target arm-gnu-eabi
我想得到答案的原因是,我是否应该花时间尝试我的库的不同配置,以及用于构建gcc
的脚本是否能够进行一些隐式阶段1构建,这可能会在x64上为我临时引导ARM编译器,这样我就可以为我想要的目标生成我需要的工具链。
"我可以用X64为ARM构建gcc吗?"
是的,你可以。我在我的一篇博客文章中描述了suse-linux主机开发系统的这个过程。
==================================================================================我将在这里复制步骤:
1.确保有必要的标题&已安装的库
我使用了YAST的"安装软件"功能,安装了完成所有构建步骤所需的以下软件包(只需搜索软件包名称,选择并接受):
- gmp-devel
- mpfr-devel
- mpc-devel
- texinfo
- ncurses开发
- 期限上限
2.创建目录骨架
cd ~
mkdir arm-none-eabi arm-none-eabi-src
cd arm-none-eabi
mkdir src build
cd ~/arm-none-eabi-src
mkdir src build
3.下载源程序包并提取它们
我在这里使用gcc-4.7.1
,但同样的过程当然也适用于较新版本的GCC。
cd ~/arm-none-eabi-src/src
wget ftp://ftp.gnu.org/gnu/gcc/gcc-4.7.1/gcc-4.7.1.tar.bz2
wget ftp://ftp.gnu.org/gnu/binutils/binutils-2.22.tar.bz2
wget ftp://ftp.gnu.org/gnu/gdb/gdb-7.4.tar.bz2
wget ftp://sources.redhat.com/pub/newlib/newlib-1.20.0.tar.gz
tar -xf gcc-4.7.1.tar.bz2
tar -xf binutils-2.22.tar.bz2
tar -xf gdb-7.4.tar.bz2
tar -xf newlib-1.20.0.tar.gz
4.构建binutils
cd ~/arm-none-eabi-src/build
mkdir binutils-2.22
cd binutils-2.22
../../src/binutils-2.22/configure
--target=arm-none-eabi
--prefix=$HOME/arm-none-eabi
--with-cpu=cortex-m3
--with-no-thumb-interwork
--with-mode=thumb
make all install
export PATH="$PATH:$HOME/arm-none-eabi/bin"
5.构建GCC(第1部分)
cd ~/arm-none-eabi-src/build
mkdir gcc-4.7.1
cd gcc-4.7.1
../../src/gcc-4.7.1/configure --target=arm-none-eabi
--prefix=$HOME/arm-none-eabi --with-cpu=cortex-m3
--with-mode=thumb --disable-multilib
--with-no-thumb-interwork
--enable-languages="c,c++" --with-newlib
--with-headers=../../src/newlib-1.20.0/newlib/libc/include
make all-gcc install-gcc
--enable cxx flags configure选项可能还用于控制libstdc++的构建标志(包括在该步骤中):
--enable-cxx-flags='-fno-exceptions
-ffunction-sections -fno-omit-frame-pointer'
通常,应该使用相同的C++编译标志,因为它们在构建预期目标代码时会出现。
6.使用交叉编译器构建GCC newlib(第2部分)
cd ~/arm-none-eabi-src/build
mkdir newlib-1.20.0
cd newlib-1.20.0
../../src/newlib-1.20.0/configure --target=arm-none-eabi
--prefix=$HOME/arm-none-eabi --disable-multilib
--disable-newlib-supplied-syscalls
make all install
关于--disable-newlib-supplied-syscalls
选项的说明:
当您打算在不使用类似linux的操作系统或根本不使用操作系统的情况下为目标进行编译时,禁用默认的newlib系统调用存根实现通常是一个好主意。它将在您需要为newlib提供的未实现的存根函数上留下链接器错误。删除该选项仍然可以使用自己的实现覆盖newlib提供的存根。
不过,当您计划将交叉工具链与CMake结合使用时,应该省略此选项。CMake使用指定的编译器定义(例如,从toolchain.CMake文件)进行一些基本测试,如果没有提供默认的存根实现,这些测试将失败。
7.完成GCC的安装
cd ~/arm-none-eabi-src/build/gcc-4.7.1
make all install
8.构建GDB
cd ~/arm-none-eabi-src/build
mkdir gdb-7.4
cd gdb-7.4
../../src/gdb-7.4/configure --target=arm-none-eabi
--prefix=$HOME/arm-none-eabi
make all install
更新
同样适用于GCC 4.8.2。