确定在Pi Zero W(armv6)上导致“非法指令”的库,并修复构建

时间:2019-01-05 21:33:35

标签: raspberry-pi arm armv6

我了解到Pi Zeros上的许多编译问题是由于它们使用armv6造成的,而3A +和B +等较新的Raspberry Pi则使用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 :(得分:1)

要识别诸如Illegal instruction之类的故障,可以在能够与操作系统的故障处理程序进行交互的调试器下运行程序。

在诸如pi之类的Linux系统上,其值为gdb。您可能需要将其安装在sudo apt-get install gdb

的基于debian的发行版上

然后运行程序

gdb myprog

或者如果您的程序需要命令行参数

gdb myprog --args some_argument another_argument

一旦gdb启动run类型,该程序将在接近非法指令的情况下正常执行,这时您将在gdb提示符下转储,并返回一条希望提供信息的错误消息

您可以在其中使用诸如backtrace之类的命令或者程序员是否具有关联的源list进行探索。如果问题出在gdb可以看作是从文件映射的地址,它应该向您显示-您还可以通过gdb命令info files或通过查看/proc/[PID]/maps来获取映射信息。 / p>

如果由于某种原因无法在gdb下实时运行程序,则可以研究如何为系统启用核心转储,然后将程序和核心转储加载到gdb中以进行事后分析。


根据系统配置,如果在没有调试器的情况下在自己的上运行程序,则您可能还会在dmesg的输出或其他系统日志中看到有关故障的信息。