我可以用X64为ARM构建gcc吗



我需要一个明确的答案,因为我还不清楚,而且我在文档中找不到明确的答案。

假设我有一个工作的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。

最新更新