linux 交叉编译 gcc 10.1.0 for avr 失败

cross compile gcc 10.1.0 for avr fails on linux

我尝试在 linux 上为 avr 编译当前 gcc 版本 10.1.0 但它失败了。

'/home/krud/git_my_checkout/first/own_components/gcc_install/gcc/gcc-10.1.0/build/gcc'
g++ -c   -g -O2 -DIN_GCC  -DCROSS_DIRECTORY_STRUCTURE   -fno-exceptions
-fno-rtti -fasynchronous-unwind-tables -W -Wall -Wno-narrowing
-Wwrite-strings -Wcast-qual -Wno-error=format-diag
-Wmissing-format-attribute -Woverloaded-virtual -pedantic -Wno-long-long
-Wno-variadic-macros -Wno-overlength-strings   -DHAVE_CONFIG_H
-DGENERATOR_FILE -fno-PIE -I. -Ibuild -I../../gcc -I../../gcc/build
-I../../gcc/../include  -I../../gcc/../libcpp/include  \
    -o build/genmodes.o ../../gcc/genmodes.c
/opt/avr_10.1.0/avr/bin/as: unrecognized option '--64'

正如我所见,它尝试使用 linux gcc 进行编译,并使用 link 和 avr-as 进行编译,这是 错误的。我做错了什么/我能改变什么?

我做了什么:

make binutils
make gcc 

使用以下 Makefile

PREFIX=/opt
VERSION_BINUTILS=2.34
VERSION_GCC=10.1.0
GCC_DOWNLOAD_SUBDIR=gcc-10.1.0
MPC_VERSION=1.0.3
MPFR_VERSION=3.1.4
GMP_VERSION=6.1.0

binutils:
    mkdir binutils
    ( cd binutils; \
        wget https://ftp.gnu.org/gnu/binutils/binutils-2.34.tar.xz; \
        tar xf binutils-2.34.tar.xz ; \
        cd binutils-2.34 ; \
        mkdir build ; \
        cd build ; \
        ../configure --target=avr --prefix=$(PREFIX)/avr_$(VERSION_GCC) ;\
        make -j8 ; \
        sudo make install ; \
        )

gcc:
    mkdir gcc
    ( cd gcc; \
        wget https://ftp.gnu.org/gnu/gcc/$(GCC_DOWNLOAD_SUBDIR)/gcc-$(VERSION_GCC).tar.xz ; \
        tar xf gcc-$(VERSION_GCC).tar.xz ; \
        cd gcc-$(VERSION_GCC)/ ; \
        wget https://gcc.gnu.org/pub/gcc/infrastructure/mpc-$(MPC_VERSION).tar.gz ; \
        tar xf mpc-$(MPC_VERSION).tar.gz ; \
        mv mpc-$(MPC_VERSION) ./mpc ; \
        wget https://gcc.gnu.org/pub/gcc/infrastructure/mpfr-$(MPFR_VERSION).tar.bz2 ; \
        tar xf mpfr-$(MPFR_VERSION).tar.bz2 ; \
        mv mpfr-$(MPFR_VERSION) ./mpfr ; \
        wget https://gcc.gnu.org/pub/gcc/infrastructure/gmp-$(GMP_VERSION).tar.bz2 ; \
        tar xf gmp-$(GMP_VERSION).tar.bz2 ; \
        mv gmp-$(GMP_VERSION) ./gmp ; \
        mkdir build ; \
        cd build ; \
        ../configure --prefix=$(PREFIX)/avr_$(VERSION_GCC) --target=avr --enable-languages=c,c++ --enable-lto --disable-nls --disable-libssp ; \
        make -j8 ; \
        sudo make install ; \
        )

您安装了没有 --exec-prefix 的 AVR binutils 并将其放入您的 PATH 中,无意中破坏了您的正常 gcc。你在这里看到的是本地机器的 g++ 运行 as 到 assemble ,这似乎是一个 64 位系统。不幸的是,它在 PATH 中找到的 as 不知道该目标。在例如Debian GNU/Linux,您可以安装 binutils 以支持包 binutils-multiarch 中的多种体系结构,或特定平台,例如binutils-avr.

$PATH 中删除 /opt/avr_10.1.0/avr/bin 后,您的 gcc 应该可以正常工作。

对于 gcc-help,我得到了以下有效解决方案:

Looks like a PATH environment variable problem. Do you have "." (dot) on your path? In the gcc build tree, we create a script/link called as for the cross compiler to use. But if you have dot on your path, before /usr/bin, then this script/link will be used with the native gcc instead of the native as, and your build can fail like this.

删除后。 (点)从我的 $PATH 一切正常!

顺便说一句:与 9.3 相比,gcc10 将 avr 上的代码大小减少了 >40%。太棒了!