我试图在Mac OS X上构建一个gcc交叉编译器,目标是arm-elf-eabi
。
这是我到目前为止所做的:
我尝试不使用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而不会出现问题:
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 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
r&#39;错误。
/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方法。
我的猜测是来自Apple的汇编程序as
与gcc给出的参数有问题(因为clang / llvm没有任何问题)。
可能有什么问题?如何解决这个问题?
答案 0 :(得分: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
答案 1 :(得分:1)
在目录build-gcc/gcc
中,存在要调用的as
脚本文件而不是/usr/bin/as
。当我将as
重命名为as_temp
并重新运行时,一切正常。
环境变量AS=/usr/bin/as
似乎无法解决此问题。
我需要再修改一次/opt/cross/arm-elf-eabi/sys-root/usr/include
,以防止出现其他错误消息。
我还发现this site在Mac OS X上交叉编译时非常有用。
答案 2 :(得分:0)
有一个预配置的交叉编译器,它的名字是Linaro,你可以从official site获得它。 如果您需要,here是一个指南,向您展示如何安装和编译它。 例如,对于.c文件:
${PREFIX}gcc -Wall -Wextra -Os -ffreestanding -mcpu=cortex-a8 -march=armv7-a -mfpu=neon -marm -c filename.c
其中Prefix代表您安装该工具的目录。