Определить библиотеку, которая вызывает «Недопустимые инструкции» для Pi Zero W (armv6), и исправить сборку - PullRequest
0 голосов
/ 06 января 2019

Я понимаю, что многие проблемы компиляции в Pi Zeros связаны с тем, что они используют armv6, в то время как более новые Raspberry Pi, такие как 3 A + и B +, используют armv7. Однако я не понимаю, как найти нарушающую библиотеку в приложении, которое вызывает проблему, и, возможно, есть простое решение проблемы.

Фон:

Я пытаюсь перенести приложение из среды рабочего стола Linux на Pi Zero (работает armv6). Я успешно портировал его на Pi 3 B и B +. То есть я скомпилировал код и проверил, что он выдает правильный вывод.

Однако реализация Pi Zero компилируется, но при запуске выдает только одно сообщение:

Illegal instruction

Это наиболее вероятно из-за какой-то команды, которая не совместима с armv6, но я не могу понять, какая это команда. Я хотел бы начать с определения, какая библиотека является проблемным ребенком. Пожалуйста, скажите мне, как бы я это диагностировал.

Дополнительная информация:

Я проверил, что проблема не в компиляторе. Как? Я сделал простую программу hello world и скомпилировал ее для Pi Zero:

#include<iostream>

int main(int argc, char *argv[]){
   std::cout << "Hello World!" << std::endl;
   return 0;
}

Так что сам компилятор, похоже, не является проблемой.

Подробнее:

Если я запускаю readelf -A myapp, я понимаю, что вывод сообщает, что приложение действительно скомпилировано для armv6:

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_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

Вот readelf -A для одной из общих библиотек:

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: VFPv4
  Tag_Advanced_SIMD_arch: NEONv1 with Fused-MAC
  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_HardFP_use: Deprecated
  Tag_ABI_VFP_args: VFP registers
  Tag_CPU_unaligned_access: v6

1 Ответ

0 голосов
/ 06 января 2019

Чтобы идентифицировать ошибку, такую ​​как Illegal instruction, вы можете запустить программу в отладчике, способном взаимодействовать с обработчиком ошибок операционной системы.

В системе Linux, такой как pi, это будет gdb. Вам может понадобиться установить это в производный от Debian дистрибутив, который будет sudo apt-get install gdb

Затем запустите вашу программу

gdb myprog

или если вашей программе нужны аргументы командной строки

gdb myprog --args some_argument another_argument

Как только gdb запустится, введите run, и программа будет выполняться почти нормально, пока не достигнет недопустимой инструкции, после чего вы будете возвращены обратно в приглашение gdb с, надеюсь, информативным сообщением об ошибке.

Там вы можете исследовать с помощью таких команд, как backtrace или, если у программиста есть связанный источник, list. Если ошибка находится по адресу, который GDB может видеть как отображенный как из файла, он должен показать вам, что - вы также можете получить информацию о отображении с помощью команды gdb info files или заглянув в /proc/[PID]/maps

Если по какой-то причине вы не можете запустить программу в режиме реального времени под GDB, вы можете изучить, как включить дампы ядра для вашей системы, а затем загрузить программу и дамп ядра в gdb для последующего анализа.


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

...