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

5
我正在尝试在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

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

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

构建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

构建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

然而,在构建过程中我遇到了“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

另类构建方式

我尝试使用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

然后,使用make all-gcc时很好用,但是我在make all-target-libgcc时遇到了不同的错误,所以我将继续使用gcc方法而不是clang/llvm方法。
我的猜测是苹果的汇编器as在处理gcc给出的参数时可能有问题(因为clang/llvm没有问题)。
可能出了什么问题?如何解决这个问题?
4个回答

4

安装 HomebrewBrew Cask,然后执行以下操作:

brew cask install gcc-arm-embedded

2
在目录build-gcc/gcc中存在一个as脚本文件,需要调用它来替换/usr/bin/as。当我将as重命名为as_temp并重新运行时,一切都正常了。
环境变量AS=/usr/bin/as似乎不能解决这个问题。
我还需要做一个修改,即需要创建/opt/cross/arm-elf-eabi/sys-root/usr/include以避免出现另一个错误信息。
我还发现这个网站在Mac OS X上进行交叉编译非常有用。

"mkdir -p /opt/cross/arm-elf-eabi/sys-root/usr/include" 谢谢你的提示! - wanyancan
具体来说,需要将文件build-gcc/gcc/as重命名为build-gcc/gcc/as_temp。而不是文件/usr/bin/as。 - wanyancan

2
这是我在Mac OS X上进行交叉编译并使用qemu检查其是否正常工作的方法。

编译

只需按照此说明操作-https://github.com/jsnyder/arm-eabi-toolchain
mkdir /opt/arm # and make it writable
PREFIX=/opt/arm PROCS=8 CC=clang make install-cross
PREFIX=/opt/arm PROCS=8 CC=clang make cross-gdb

请检查所有二进制文件是否可用。

预编译的编译器

源代码

.text
entry: b start
arr:    .byte 1, 2, 3, 4, 5, 6
eoa:
.align
start:  
    ldr r0, =eoa
    ldr r1, =arr
    mov r3, #0
loop:
    ldrb r2, [r1], #1
    add r3, r2, r3
    cmp r1, r0
    bne loop
stop:   b stop

构建脚本

dd if=/dev/zero of=flash.bin bs=4096 count=4096
arm-none-eabi-as --gstabs+ -o add.o add.S
arm-none-eabi-ld -Ttext=0x0 -o add.elf add.o
arm-none-eabi-objcopy -O binary add.elf add.bin
dd if=add.bin of=flash.bin bs=4096 conv=notrunc

执行

启动qemu

qemu-system-arm -M connex -pflash flash.bin -gdb tcp::1234 -S

执行调试器。
arm-none-eabi-gdb add.elf

在调试器中开始连接

target remote :1234

您可以使用n逐行执行代码。
(gdb) target remote :1234
Remote debugging using :1234
entry () at add.S:2
2   entry: b start
(gdb) n
7       ldr r0, =eoa
(gdb) n
8       ldr r1, =arr
(gdb) n
9       mov r3, #0
(gdb) n
11      ldrb r2, [r1], #1
(gdb) n
12      add r3, r2, r3
(gdb) n
13      cmp r1, r0
(gdb) n
14      bne loop
(gdb) n
11      ldrb r2, [r1], #1
(gdb) n
12      add r3, r2, r3

参考文献


0

有一个预配置的交叉编译器,它的名字是Linaro,你可以从官方网站获取它。 如果需要,这里有一份指南,向你展示如何安装它并使用它进行编译。 例如,对于.c文件:

${PREFIX}gcc -Wall -Wextra -Os -ffreestanding -mcpu=cortex-a8 -march=armv7-a -mfpu=neon -marm -c filename.c 

其中 Prefix 代表您安装该工具的目录。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接