ошибка на первом этапе компиляции кросс-компилятора gcc (arm-none-eabi /bin / as: нераспознанный параметр ‘—64’)

#gcc #compilation #arm

#gcc #Сборник #arm

Вопрос:

Я следую процессу сборки кросс-компилятора gcc baremetal. Ниже приведена инструкция по этапу 1 ARM GCC.

   5. Configure, build and install ARM GCC stage 1.  This step creates a
     bootstrap ARM toolchain without any of the standard C libraries. Note that
     in the following commands any text within square brackets must only be used
     when building the arm-none-eabi (or armeb-none-eabi) toolchain.
     You do not type the square brackets themselves, only the text between them.

       $ cd build-<target>/gcc_stage1
       $ ../../gcc-linaro-5.3-2016.05/configure --target=<target>                     
                                                --prefix=<install_dir>                
                                                --with-arch=armv8-a                   
                                                [--with-fpu=crypto-neon-fp-armv8]     
                                                --disable-multilib                    
                                                --disable-werror                      
                                                --enable-languages=c                  
                                                --disable-shared                      
                                                --without-headers                     
                                                --with-newlib                         
                                                --with-gnu-as                         
                                                --with-gnu-ld
       $ make all-gcc <-- error here "--64"
       $ make install-gcc
       $ cd ../..
  

Для конфигурации я дал команду

 ../../gcc-linaro-5.3-2016.05/configure --target=arm-none-eabi --prefix=/opt/arm-toolchain --with-arch=armv8-a --with-fpu=crypto-neon-fp-armv8 --disable-multilib --disable-werror --enable-languages=c --disable-shared --without-headers --with-newlib --with-gu-as --with-gnu-ld
  

И затем, когда я запускаю make all-gcc , я получаю сообщение об ошибке ниже. (Для краткости показана только последняя часть, этот журнал записывается после второго ввода команды, поэтому отображается только последняя часть ошибки).

 TARGET_CPU_DEFAULT="" 
HEADERS="auto-host.h ansidecl.h" DEFINES="" 
/bin/bash ../../../gcc-linaro-5.3-2016.05/gcc/mkconfig.sh config.h
config.h is unchanged
TARGET_CPU_DEFAULT="TARGET_CPU_generic" 
HEADERS="options.h insn-constants.h config/dbxelf.h config/elfos.h config/arm/unknown-elf.h config/arm/elf.h config/arm/bpabi.h config/newlib-stdint.h config/arm/aout.h config/vxworks-dummy.h config/arm/arm.h config/initfini-array.h defaults.h" DEFINES="LIBC_GLIBC=1 LIBC_UCLIBC=2 LIBC_BIONIC=3 LIBC_MUSL=4" 
/bin/bash ../../../gcc-linaro-5.3-2016.05/gcc/mkconfig.sh tm.h
tm.h is unchanged
TARGET_CPU_DEFAULT="" 
HEADERS="config/arm/arm-protos.h config/arm/aarch-common-protos.h tm-preds.h" DEFINES="" 
/bin/bash ../../../gcc-linaro-5.3-2016.05/gcc/mkconfig.sh tm_p.h
tm_p.h is unchanged
TARGET_CPU_DEFAULT="" 
HEADERS="auto-host.h ansidecl.h" DEFINES="" 
/bin/bash ../../../gcc-linaro-5.3-2016.05/gcc/mkconfig.sh bconfig.h
bconfig.h is unchanged
g   -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 -Woverloaded-virtual -pedantic -Wno-long-long -Wno-variadic-macros -Wno-overlength-strings   -DHAVE_CONFIG_H -DGENERATOR_FILE -I. -Ibuild -I../../../gcc-linaro-5.3-2016.05/gcc -I../../../gcc-linaro-5.3-2016.05/gcc/build -I../../../gcc-linaro-5.3-2016.05/gcc/../include  -I../../../gcc-linaro-5.3-2016.05/gcc/../libcpp/include  
    -o build/genmddeps.o ../../../gcc-linaro-5.3-2016.05/gcc/genmddeps.c
/opt/arm-toolchain/arm-none-eabi/bin/as: unrecognized option '--64'
Makefile:2428: recipe for target 'build/genmddeps.o' failed
make[1]: *** [build/genmddeps.o] Error 1
make[1]: Leaving directory '/home/ckim/Downloads/arm-toolchain/build-arm-none-eabi/gcc_stage1/gcc'
Makefile:4108: recipe for target 'all-gcc' failed
make: *** [all-gcc] Error 2
  

В журнале показано as , что то, что я создал непосредственно перед этим, используется правильно. Я искал в Интернете, но не смог найти тот же случай. Кто-нибудь может дать мне несколько идей?

Ответ №1:

Вероятно, у вас есть несоответствие между архитектурой ARM, на которую вы, по-видимому, ориентируетесь, armv8-a , которая является 64-разрядной архитектурой, и набором инструментов, который вы создаете arm-none-eabi : вместо этого вы должны настроить таргетинг aarch64-none-elf : это будет что-то вроде:

 ../../gcc-linaro-5.3-2016.05/configure --target=aarch64-elf --prefix=/opt/arm-toolchain --with-arch=armv8-a --with-fpu=crypto-neon-fp-armv8 --disable-multilib --disable-werror --enable-languages=c --disable-shared --without-headers --with-newlib --with-gu-as --with-gnu-ld
  

Набор инструментов ARM gcc был создан с использованием следующих параметров:

 /opt/arm/9/gcc-arm-9.2-2019.12-x86_64-aarch64-none-elf/bin/aarch64-none-elf-gcc -v

Using built-in specs.
COLLECT_GCC=/opt/arm/9/gcc-arm-9.2-2019.12-x86_64-aarch64-none-elf/bin/aarch64-none-elf-gcc
COLLECT_LTO_WRAPPER=/opt/arm/9/gcc-arm-9.2-2019.12-x86_64-aarch64-none-elf/bin/../libexec/gcc/aarch64-none-elf/9.2.1/lto-wrapper
Target: aarch64-none-elf
Configured with: /tmp/dgboter/bbs/rhev-vm1--rhe6x86_64/buildbot/rhe6x86_64--aarch64-none-elf/build/src/gcc/configure --target=aarch64-none-elf --prefix=/tmp/dgboter/bbs/rhev-vm1--rhe6x86_64/buildbot/rhe6x86_64--aarch64-none-elf/build/build-aarch64-none-elf/install// --with-gmp=/tmp/dgboter/bbs/rhev-vm1--rhe6x86_64/buildbot/rhe6x86_64--aarch64-none-elf/build/build-aarch64-none-elf/host-tools --with-mpfr=/tmp/dgboter/bbs/rhev-vm1--rhe6x86_64/buildbot/rhe6x86_64--aarch64-none-elf/build/build-aarch64-none-elf/host-tools --with-mpc=/tmp/dgboter/bbs/rhev-vm1--rhe6x86_64/buildbot/rhe6x86_64--aarch64-none-elf/build/build-aarch64-none-elf/host-tools --with-isl=/tmp/dgboter/bbs/rhev-vm1--rhe6x86_64/buildbot/rhe6x86_64--aarch64-none-elf/build/build-aarch64-none-elf/host-tools --disable-shared --disable-nls --disable-threads --disable-tls --enable-checking=release --enable-languages=c,c  ,fortran --with-newlib --with-pkgversion='GNU Toolchain for the A-profile Architecture 9.2-2019.12 (arm-9.10)' --with-bugurl=https://bugs.linaro.org/
Thread model: single
gcc version 9.2.1 20191025 (GNU Toolchain for the A-profile Architecture 9.2-2019.12 (arm-9.10))
  

Комментарии:

1. Спасибо, значит, вы имеете в виду, что я должен удалить --with-arch=armv8-a в конфигурации? Я могу попробовать завтра.

2. Я просто дополнил свой ответ.

3. Кстати, если этот или любой другой ответ решил ваш вопрос (я думаю, что это так), пожалуйста, подумайте о том, чтобы принять его , установив флажок. Это указывает более широкому сообществу, что вы нашли решение, и дает некоторую репутацию как ответчику, так и вам. Нет никаких обязательств делать это. Будет ли используемая вами процедура работать или нет, это другая тема и может вызвать больше вопросов.

4. вам нужно использовать aarch64-whatever-as, а не arm-whatever-as. arm-whatever-as не создан для aarch64. Разные цели gnu (разные, полностью несовместимые наборы инструкций).

5. armv8-a, если это вообще поддерживается с помощью arm-whatever-whatever, может просто фактически создать для aarch32 функцию совместимости armv7-a.

Ответ №2:

so.s:

 nop
  

сборка для arm (aarch32)

 arm-none-eabi-as so.s -o so.o
arm-none-eabi-objdump -d so.o

so.o:     file format elf32-littlearm


Disassembly of section .text:

00000000 <.text>:
   0:   e1a00000    nop         ; (mov r0, r0)
  

сборка для aarch64 (64-разрядный arm)

 aarch64-none-elf-as so.s -o so.o
aarch64-none-elf-objdump -d so.o

so.o:     file format elf64-littleaarch64


Disassembly of section .text:

0000000000000000 <.text>:
   0:   d503201f    nop
  

и mips для демонстрационных целей

 mips-elf-as so.s -o so.o
mips-elf-objdump -d so.o

so.o:     file format elf32-bigmips


Disassembly of section .text:

00000000 <.text>:
   0:   00000000    nop
  

x86

 as so.s -o so.o
objdump -D so.o

so.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <.text>:
   0:   90                      nop
  

два разных набора инструкций две разные цели gnu, такие как x86, mips и arm, являются разными целями и разными сборками инструментов gnu.

Ответ Франца кстати, это всего лишь демонстрация этого ответа.