Кросс-компилятор GCC 8 выводит исполняемый файл ARMv7 вместо ARMv6 - PullRequest
2 голосов
/ 02 апреля 2019

Я пытаюсь скомпилировать приложение C ++ для Raspberry Pi Zero, используя GCC 8.2.1 .
Я использую это для относительно большого проекта C ++ 17, который создаетсяиспользую CMake, и я пытаюсь кросс-компилировать его на своем ноутбуке x86-64.

Даже при самом простом из возможных кодов я не могу скомпилировать его для ARMv6:

int main() {}
$ arm-linux-gnueabihf-g++ test.cpp -static -march=armv6 -mfpu=vfp -mfloat-abi=hard

При запуске файла на Pi я получаю ошибку Illegal instruction, и readelf возвращает следующее:

$ arm-linux-gnueabihf-readelf -A a.out
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_Advanced_SIMD_arch: NEONv1
  Tag_ABI_PCS_wchar_t: 4
  Tag_ABI_FP_rounding: Needed
  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: int
  Tag_ABI_VFP_args: VFP registers
  Tag_CPU_unaligned_access: v6

Кажется, что GCC игнорирует мои флаги архитектуры.

Когда вы просто компилируете его в объектный файл, кажется, что он работает нормально, но на этапе компоновки всегда используется ARMv7:

$ arm-linux-gnueabihf-g++ test.cpp -static -march=armv6 -mfpu=vfp -mfloat-abi=hard -c
$ arm-linux-gnueabihf-readelf -A test.o
Attribute Section: aeabi
File Attributes
  Tag_CPU_name: "6"
  Tag_CPU_arch: v6
  Tag_ARM_ISA_use: Yes
  Tag_THUMB_ISA_use: Thumb-1
  Tag_FP_arch: VFPv2
  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: int
  Tag_ABI_VFP_args: VFP registers
  Tag_ABI_optimization_goals: Aggressive Debug
  Tag_CPU_unaligned_access: v6

Что я делаю не так?

1 Ответ

0 голосов
/ 03 апреля 2019

В итоге я скомпилировал GCC из исходного кода, следуя этому посту . Мне не нужны были все шаги (сначала я скомпилировал все, используя GCC 8 вместо компиляции GCC 6.3, и я не редактировал исходные файлы.)

Я разместил Dockerfile со всеми шагами сборки на GitHub .

Архитектура созданных исполняемых файлов теперь верна, но я пока не могу проверить ее на цели, чтобы проверить, действительно ли она работает.

...