main.c.o использует аргументы регистра VFP, a.out не использует

У меня есть main.c, который компилируется так:

arm-none-eabi-gcc -mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=hard -o CMakeFiles/lab1.elf.dir/main.c.o -c main.c

Вывод readelf -A main.c.o:

Attribute Section: aeabi
File Attributes
  Tag_CPU_name: "7-A"
  Tag_CPU_arch: v7
  Tag_CPU_arch_profile: Application
  Tag_ARM_ISA_use: Yes
  Tag_THUMB_ISA_use: Thumb-2
  Tag_FP_arch: VFPv3
  Tag_ABI_PCS_wchar_t: 4
  Tag_ABI_FP_denormal: Needed
  Tag_ABI_FP_exceptions: Needed
  Tag_ABI_FP_number_model: IEEE 754
  Tag_ABI_align_needed: 8-byte
  Tag_ABI_align_preserved: 8-byte, except leaf SP
  Tag_ABI_enum_size: small
  Tag_ABI_VFP_args: VFP registers
  Tag_ABI_optimization_goals: Aggressive Debug
  Tag_CPU_unaligned_access: v6
  Tag_MPextension_use: Allowed
  Tag_Virtualization_use: TrustZone 

Затем я хочу связать этот файл с некоторыми другими имеющимися у меня библиотеками (это библиотеки C ++, поэтому я использую компоновщик g ++). Я все время получаю сообщение об ошибке, что исполняемый файл не использует аргументы VFP, несмотря на параметры командной строки для их включения:

arm-none-eabi-g++ -mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=hard  CMakeFiles/lab1.elf.dir/main.c.o

Это результат:

(Да, есть много других проблем с отсутствующими библиотеками и т. Д., Но я пытаюсь свести это к простому примеру).

(Кроме того, это отлично работало в GCC 6.3.1, это сломано только сейчас, когда я пытаюсь в 9.2.1)

/usr/lib/gcc/arm-none-eabi/9.2.1/../../../arm-none-eabi/bin/ld: error: CMakeFiles/lab1.elf.dir/main.c.o uses VFP register arguments, a.out does not
/usr/lib/gcc/arm-none-eabi/9.2.1/../../../arm-none-eabi/bin/ld: failed to merge target specific data of file CMakeFiles/lab1.elf.dir/main.c.o
/usr/lib/gcc/arm-none-eabi/9.2.1/../../../arm-none-eabi/bin/ld: CMakeFiles/lab1.elf.dir/main.c.o: in function `main':
main.c:(.text+0x8): undefined reference to `display_init'
/usr/lib/gcc/arm-none-eabi/9.2.1/../../../arm-none-eabi/bin/ld: main.c:(.text+0x10): undefined reference to `display_fillScreen'
/usr/lib/gcc/arm-none-eabi/9.2.1/../../../arm-none-eabi/bin/ld: main.c:(.text+0x1c): undefined reference to `display_setCursor'
/usr/lib/gcc/arm-none-eabi/9.2.1/../../../arm-none-eabi/bin/ld: main.c:(.text+0x24): undefined reference to `display_setTextColor'
/usr/lib/gcc/arm-none-eabi/9.2.1/../../../arm-none-eabi/bin/ld: main.c:(.text+0x2c): undefined reference to `display_setTextSize'
/usr/lib/gcc/arm-none-eabi/9.2.1/../../../arm-none-eabi/bin/ld: main.c:(.text+0x38): undefined reference to `display_println'
/usr/lib/gcc/arm-none-eabi/9.2.1/../../../arm-none-eabi/bin/ld: /usr/lib/gcc/arm-none-eabi/9.2.1/../../../arm-none-eabi/lib/libc.a(lib_a-exit.o): in function `exit':
/build/newlib-CVVEyx/newlib-3.3.0/build/arm-none-eabi/newlib/libc/stdlib/../../../../../newlib/libc/stdlib/exit.c:64: undefined reference to `_exit'
/usr/lib/gcc/arm-none-eabi/9.2.1/../../../arm-none-eabi/bin/ld: /usr/lib/gcc/arm-none-eabi/9.2.1/../../../arm-none-eabi/lib/libc.a(lib_a-sbrkr.o): in function `_sbrk_r':
/build/newlib-CVVEyx/newlib-3.3.0/build/arm-none-eabi/newlib/libc/reent/../../../../../newlib/libc/reent/sbrkr.c:51: undefined reference to `_sbrk'
/usr/lib/gcc/arm-none-eabi/9.2.1/../../../arm-none-eabi/bin/ld: /usr/lib/gcc/arm-none-eabi/9.2.1/../../../arm-none-eabi/lib/libc.a(lib_a-writer.o): in function `_write_r':
/build/newlib-CVVEyx/newlib-3.3.0/build/arm-none-eabi/newlib/libc/reent/../../../../../newlib/libc/reent/writer.c:49: undefined reference to `_write'
/usr/lib/gcc/arm-none-eabi/9.2.1/../../../arm-none-eabi/bin/ld: /usr/lib/gcc/arm-none-eabi/9.2.1/../../../arm-none-eabi/lib/libc.a(lib_a-closer.o): in function `_close_r':
/build/newlib-CVVEyx/newlib-3.3.0/build/arm-none-eabi/newlib/libc/reent/../../../../../newlib/libc/reent/closer.c:47: undefined reference to `_close'
/usr/lib/gcc/arm-none-eabi/9.2.1/../../../arm-none-eabi/bin/ld: /usr/lib/gcc/arm-none-eabi/9.2.1/../../../arm-none-eabi/lib/libc.a(lib_a-fstatr.o): in function `_fstat_r':
/build/newlib-CVVEyx/newlib-3.3.0/build/arm-none-eabi/newlib/libc/reent/../../../../../newlib/libc/reent/fstatr.c:55: undefined reference to `_fstat'
/usr/lib/gcc/arm-none-eabi/9.2.1/../../../arm-none-eabi/bin/ld: /usr/lib/gcc/arm-none-eabi/9.2.1/../../../arm-none-eabi/lib/libc.a(lib_a-isattyr.o): in function `_isatty_r':
/build/newlib-CVVEyx/newlib-3.3.0/build/arm-none-eabi/newlib/libc/reent/../../../../../newlib/libc/reent/isattyr.c:52: undefined reference to `_isatty'
/usr/lib/gcc/arm-none-eabi/9.2.1/../../../arm-none-eabi/bin/ld: /usr/lib/gcc/arm-none-eabi/9.2.1/../../../arm-none-eabi/lib/libc.a(lib_a-lseekr.o): in function `_lseek_r':
/build/newlib-CVVEyx/newlib-3.3.0/build/arm-none-eabi/newlib/libc/reent/../../../../../newlib/libc/reent/lseekr.c:49: undefined reference to `_lseek'
/usr/lib/gcc/arm-none-eabi/9.2.1/../../../arm-none-eabi/bin/ld: /usr/lib/gcc/arm-none-eabi/9.2.1/../../../arm-none-eabi/lib/libc.a(lib_a-readr.o): in function `_read_r':
/build/newlib-CVVEyx/newlib-3.3.0/build/arm-none-eabi/newlib/libc/reent/../../../../../newlib/libc/reent/readr.c:49: undefined reference to `_read'
/usr/lib/gcc/arm-none-eabi/9.2.1/../../../arm-none-eabi/bin/ld: /usr/lib/gcc/arm-none-eabi/9.2.1/../../../arm-none-eabi/lib/libc.a(lib_a-abort.o): in function `abort':
/build/newlib-CVVEyx/newlib-3.3.0/build/arm-none-eabi/newlib/libc/stdlib/../../../../../newlib/libc/stdlib/abort.c:59: undefined reference to `_exit'
/usr/lib/gcc/arm-none-eabi/9.2.1/../../../arm-none-eabi/bin/ld: /usr/lib/gcc/arm-none-eabi/9.2.1/../../../arm-none-eabi/lib/libc.a(lib_a-signalr.o): in function `_kill_r':
/build/newlib-CVVEyx/newlib-3.3.0/build/arm-none-eabi/newlib/libc/reent/../../../../../newlib/libc/reent/signalr.c:53: undefined reference to `_kill'
/usr/lib/gcc/arm-none-eabi/9.2.1/../../../arm-none-eabi/bin/ld: /usr/lib/gcc/arm-none-eabi/9.2.1/../../../arm-none-eabi/lib/libc.a(lib_a-signalr.o): in function `_getpid_r':
/build/newlib-CVVEyx/newlib-3.3.0/build/arm-none-eabi/newlib/libc/reent/../../../../../newlib/libc/reent/signalr.c:83: undefined reference to `_getpid'
collect2: error: ld returned 1 exit status

person jgoeders    schedule 14.08.2020    source источник
comment
Обычно вам нужно скомпилировать все свои библиотеки с одним и тем же ABI.   -  person user253751    schedule 14.08.2020
comment
Да, я указываю -mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=hard как на этапе компиляции, так и на этапе компоновки. Я пока не подключаюсь к каким-либо библиотекам, но все равно получаю сообщение об ошибке. Ошибка предполагает, что я не доказываю -mfloat-abi=hard компоновщику, который генерирует a.out, но это так. Вот что смущает.   -  person jgoeders    schedule 14.08.2020
comment
По умолчанию вы подключаете стандартную библиотеку C (newlib libc).   -  person user253751    schedule 14.08.2020
comment
Есть ли способ узнать, какая библиотека libc используется arm-none-eabi-g ++, чтобы я мог проверить, скомпилирована ли она с жестким float?   -  person jgoeders    schedule 14.08.2020
comment
Что ж, сообщения об ошибках буквально сообщают вам, в какой библиотеке есть проблемы. И я отмечу, что если бы это было жесткое плавание, все называлось бы eabihf, а не eabi   -  person user253751    schedule 14.08.2020


Ответы (2)


Я считаю, что это проблема, аналогичная обсуждаемой здесь: Проблема с кросс-компиляцией тривиального примера с gcc при использовании жесткого числа с плавающей запятой

Кажется, что линкуется не та версия libc, несмотря на параметры -mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=hard, заданные компоновщику.

Я смог исправить это, используя -march=armv7-a вместо -mcpu=cortex-a9, как было предложено в одном из комментариев на этой странице.

person jgoeders    schedule 14.08.2020

Если кто-то из фьючерсов наткнется на эту тему и ищет ответы:

Мне пришлось проверить, установлен ли -mfloat-abi=hard для GCC G ++ и Linker. Но поскольку оборудование выбрано, мне пришлось ТАКЖЕ проверить, установлен ли -mfpu=XXX (что не было по какой-то непонятной причине)

person dOM    schedule 05.04.2021