c++ - 我可以用 X64 为 ARM 构建 gcc 吗?

标签 c++ c gcc gnu

我需要一个明确的答案,因为这对我来说仍然不清楚,而且我在文档中的任何地方都找不到明确的答案。

假设我有一个可用的 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 编译器,这样我就可以生成我想要的目标所需的工具链。

最佳答案

"Can I build gcc for ARM with an X64 one?"

是的,可以。我在 blog post of mine 中描述了 suse linux 主机开发系统的这个过程。 .

================================================== ===================================== 我将在此处复制这些步骤:

<强>1。确保安装了必要的 header 和库

我使用了 YAST 的“安装软件”功能来安装完成所有构建步骤所需的以下软件包(只需搜索软件包名称,选择并接受):


  • gmp 开发
  • mpfr-开发
  • mpc 开发
  • 纺织信息
  • 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 配置选项还可以用于控制 libstdc++ 的构建标志(包含在此步骤中):

--enable-cxx-flags='-fno-exceptions \
    -ffunction-sections -fno-omit-frame-pointer'

一般来说,应该使用相同的 C++ 编译标志,因为它们在构建预期目标代码时会出现。


<强>6。使用交叉编译器构建GCC newlib(第二部分)


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 系统调用 stub 实现通常是一个好主意。它会让您在需要为 newlib 提供的未实现的 stub 函数上留下链接器错误。 删除该选项仍然使您能够使用自己的实现覆盖 newlib 提供的 stub 。

但是,当您计划将跨工具链与 CMake 结合使用时,您应该忽略此选项。 CMake 使用指定的编译器定义(例如来自 toolchain.cmake 文件)进行一些基本测试,如果没有提供默认的 stub 实现,这些测试将会失败。


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。

关于c++ - 我可以用 X64 为 ARM 构建 gcc 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26305738/

相关文章:

c++ - 带有 std::ate 的 std::ofstream 未在末尾打开

c++ - IDA PRO 将 C++ 代码转换为 C 代码 __OFSUB__ 宏

c - 无法右对齐马里奥问题集的金字塔

c - 从 C 程序编写 bash 应用程序的 STDIN

gcc - 当在内联汇编中编译 inb 和 outb 时产生 "Error: operand type mismatch"

c++ - valgrind Conditional jump or move depends on uninitialised value(s) ,这是否表示内存泄漏?

c++ - 将 boost::asio::async_wait_until 与 boost::asio::streambuf 一起使用

c - 跟踪程序逻辑时遇到问题,包括 Fork()

linux - 如何禁用 SVC ARM 指令(gcc、uclibc、buildroot)?

c++ - 错误 : invalid conversion from 'void (*)()' to 'void (*)()' -- what?