我知道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正在运行
所以使用臂弓