确定导致 Pi Zero W (armv6) "Illegal instruction"的库,并修复构建



我知道Pi Zeros上的许多编译问题是由于它们使用armv6,而较新的Raspberry Pi(如3 a+和B+)使用armv7。但是,我不知道如何在导致问题的应用程序中找到有问题的库,也不知道是否有简单的解决方法。

背景:

我正在尝试将一个应用程序从Linux桌面环境移植到Pi Zero(运行armv6)。我成功地将它移植到Pi 3B和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

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

在像pi这样的Linux系统上,这将是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或其他系统日志的输出中看到有关故障的信息。

我有一个简单的答案,只需按下按钮并尝试

如果你有armel ,rpi0可以运行所有程序

看这里它的rpi0操作系统构建脚本构建一个基于armel架构的最小操作系统

https://gitlab.com/kalilinux/build-scripts/kali-arm

我是如何解决的我试图在raspbian操作系统上运行java,但它不起作用我使用了kali for raspbian pi zero java正在运行

所以使用臂弓

最新更新