用交叉编译链完成编译后,在开发板上运行时报错“Illegal instruction”

用户您好,请详细描述您所遇到的问题:

  1. 系统软件版本:Linux ubuntu 4.14.87 #4 SMP PREEMPT Wed Jan 24 13:35:26 CST 2024 aarch64 aarch64 aarch64 GNU/Linux

  2. 问题涉及的技术领域: 硬件、操作系统、编译

  3. 问题描述:用交叉编译链完成编译后,在开发板上运行时报错“Illegal instruction ”。昨天还能运行,今天重新连接开发板后就报错了,重新设置环境变量,也不行。

  4. 复现概率:必现 已进行的排查措施、分析及结果:

  5. 重设环境变量

  6. 重新编译

  7. 检查系统内存,内存足够

  8. 使用软连接,没用

  9. 检查架构,没问题,毕竟昨天还能跑通

  10. 提供必要的问题日志: ./0626 I0000 00:00:00.000000 6217 vlog_is_on.cc:197] RAW: Set VLOG level for “*” to 3 [BPU_PLAT]BPU Platform Version(1.3.3)! [HBRT] set log level as 0. version = 3.15.29.0 Illegal instruction

  11. 软件上是否有做自定义修改:没有,只把模型部分换成我自己的,昨天还可以正常运行,今天怎么搞都会报错:“Illegal instruction”

遇到“非法指令”(Illegal instruction)错误通常意味着程序尝试执行了一条处理器无法识别的指令,这可能是由于以下几个原因造成的:

1. **编译器与目标平台不匹配**:

- 确认你的编译器版本以及使用的编译选项是否与目标硬件架构完全匹配。由于你提到的是在 aarch64 架构上运行,确保你的交叉编译链是针对 aarch64 架构的,并且在编译时指定了正确的架构标志。

2. **代码中的bug**:

- 由于你说没有对代码进行自定义修改,只是替换了模型部分,那么可能的问题在于替换的模型部分是否与程序的其余部分兼容。检查模型部分是否包含了一些不适合目标平台的指令集特性。

3. **字节序问题**:

- 确认你的主机和目标设备之间的字节序(endianness)是否一致。如果模型数据是在一个大端序(Big Endian)机器上创建的,而在一个小端序(Little Endian)机器上运行,则可能导致字节序不匹配问题。

4. **库版本不兼容**:

- 确认所有依赖的库文件版本是否正确,并且与你编译时链接的库版本相匹配。

5. **编译标志**:

- 确认编译时使用的标志是否适合目标架构。比如,是否使用了 `-march=armv8-a` 这样的标志来指定 ARMv8-A 架构。

6. **链接器脚本或配置**:

- 检查链接器脚本(Linker Script)或配置是否正确。有时链接器配置不当也会导致这样的问题。

7. **环境变量问题**:

- 虽然你提到已经重新设置了环境变量,但是再次确认一下环境变量是否正确设置,特别是 PATH 和 LD_LIBRARY_PATH 等。

建议的排查步骤:

- 使用 `strace` 或者 `gdb` 来调试程序,查看具体的出错点。可以运行如下命令来启动 gdb 并附加到你的程序:

```sh

gdb --args ./your_program

```

然后在 gdb 提示符下运行 `run`,当程序崩溃时,使用 `bt` 命令查看调用栈,找出非法指令的具体位置。

- 确认编译时使用的 Makefile 或 CMake 配置文件中的编译选项是否适合目标架构。

- 检查交叉编译的工具链版本是否正确,确认是否需要更新工具链。

- 尝试在一个干净的环境中重新编译整个项目,包括模型部分。

- 如果可能的话,将模型部分单独提取出来,在目标平台上使用相同的编译器和工具链编译,看是否能单独运行。

通过上述方法,你应该能够进一步缩小问题范围,并找到解决方案。

你好,具体问题还需要具体分析,做C的开发需要具有一定的debug能力。-

这里是一些建议: