如何在Mac OS X上进行ARM交叉编译(错误:无效列表选项`r' - 交叉编译错误)

pro*_*eek 5 macos gcc arm cross-compiling

我正在尝试在Mac OS X上构建一个gcc交叉编译器,目标是arm-elf-eabi.

这是我到目前为止所做的:

安装gcc和环境设置

我尝试不使用Mac的clang/llvm,所以我使用brew中的gcc-4.8.

brew tap homebrew/versions 
brew install gcc48
brew install binutils
Run Code Online (Sandbox Code Playgroud)

在构建之前,我设置了环境变量:

export CC=/usr/local/bin/gcc-4.8
export CXX=/usr/local/bin/g++-4.8
export CPP=/usr/local/bin/cpp-4.8
export LD=/usr/local/bin/gcc-4.8
export PREFIX=/opt/cross
export TARGET=arm-elf-eabi
Run Code Online (Sandbox Code Playgroud)

建立binutils

下载binutils源,然后创建一个构建目录,并可以构建binutils而不会出现问题:

mkdir build-binutils
cd build-binutils
../binutils-2.24/configure --target=$TARGET --prefix=$PREFIX --with-sysroot --enable-64-bit-bfd --disable-shared --disable-werror --disable-nls
make configure-host
make LDFLAGS="-all-static"
sudo make install
Run Code Online (Sandbox Code Playgroud)

建设gcc

下载gcc 4.8源代码,并运行构建过程

mkdir build-gcc
cd build-gcc
../gcc-4.8.3/configure --target=$TARGET --prefix=$PREFIX --disable-nls --enable-languages=c,c++ --without-headers --disable-shared --enable-multilib --with-sysroot --disable-werror
make configure-host
make all-gcc << ERROR
make all-target-libgcc
Run Code Online (Sandbox Code Playgroud)

但是,我invalid listing option在建筑时遇到了错误.

/usr/local/bin/g++-4.8 -c   -g -O2 -DIN_GCC -DCROSS_DIRECTORY_STRUCTURE  -fno-exceptions -fno-rtti -fasynchronous-unwind-tables -W -Wall -Wno-narrowing -Wwrite-strings -Wcast-qual -Wmissing-format-attribute -pedantic -Wno-long-long -Wno-variadic-macros -Wno-overlength-strings   -DHAVE_CONFIG_H -DGENERATOR_FILE -I. -Ibuild -I../../gcc-4.8.3/gcc -I../../gcc-4.8.3/gcc/build -I../../gcc-4.8.3/gcc/../include  -I../../gcc-4.8.3/gcc/../libcpp/include  \
        -o build/genconstants.o ../../gcc-4.8.3/gcc/genconstants.c
Assembler messages:
Fatal error: invalid listing option `r'
make[2]: *** [build/genconstants.o] Error 1
make[1]: *** [all-gcc] Error 2
Run Code Online (Sandbox Code Playgroud)

替代建筑过程

我尝试使用Mac中的默认编译器,具有以下配置:

./contrib/download_prerequisites
CFLAGS="-arch i386 -arch x86_64 -Wno-error=deprecated-declarations -Wno-error=unused-variable -Wno-error=unused-function" ../gcc-4.8.3/configure --target=$TARGET --prefix=$PREFIX --disable-nls --enable-languages=c --without-headers --disable-shared --enable-multilib
Run Code Online (Sandbox Code Playgroud)

然后,它工作正常make all-gcc,但我也有不同的错误make all-target-libgcc,所以我会坚持使用gcc方法而不是clang/llvm方法.

我的猜测是as来自Apple 的汇编程序与gcc给出的参数有问题(因为clang/llvm没有任何问题).

可能有什么问题?如何解决这个问题?

pro*_*eek 2

该目录中build-gcc/gcc存在as要调用的脚本文件,而不是/usr/bin/as. 当我重命名asas_temp并重新运行时,一切正常。环境变量AS=/usr/bin/as似乎并不能解决这个问题。

我还需要进行一项修改,/opt/cross/arm-elf-eabi/sys-root/usr/include以防止出现另一条错误消息。

我还发现这个网站对于 Mac OS X 上的交叉编译非常有用。