【发布时间】:2015-04-20 08:49:47
【问题描述】:
我有一台运行 Linux (BusyBox) 的 ARM 机器。
# uname -a
# Linux XXXXXXXX 2.6.28 #1 PREEMPT Fri Sep 26 22:47:38 UTC 2014 armv5tel GNU/Linux
我在我的 Ubuntu 32 位桌面上交叉编译了一个简单的程序:
./configure --host=arm-linux-gnueabi LDFLAGS="-static"
make
但是当我尝试在 ARM 机器上运行它时,它给了我 Segmentation Fault 错误。
程序超级简单:
#include <stdio.h>
int main()
{
printf("Hello, World!");
return 0;
}
以下是我已经尝试/检查过的一些事情:
- 我已经检查了两台机器上的 md5 哈希值,以消除通过网络复制可执行文件时出现问题的可能性
- 使用
arm-linux-gnueabi-strip剥离可执行文件。我正在将我的可执行文件与另一个已经在目标机器中的可执行文件与file进行比较:
# file my_program
# my_program: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, for GNU/Linux 2.6.31, BuildID[sha1]=0x4b1f2773e54b141d5157b86f0f10438a372625c9, stripped
# file their_program
# their_program: ELF 32-bit LSB executable, ARM, version 1 (GNU/Linux), statically linked, stripped
我做错了什么?
【问题讨论】:
-
busybox 和 arm-linux-gnueabi。是否有可能一个是 uClibc 而另一个是 eglibc。现在,您还遇到了 softfp 类型的 ABI 问题。 armv5tel 通常没有
fp寄存器,所以我会指定-mfloat-abi=soft并选择“softfp”库。可能您拥有的 Ubuntu 工具链不支持此功能。在this question on thumb entry,您可以找到一些可以用-nostartfiles -static -nostdlib编译的代码,任何工具链都可以生成使用这些技术运行的Linux 二进制文件。 -
@artlessnoise 感谢 uClibc 的想法,这让我研究它并最终找出解决方案
标签: gcc segmentation-fault arm cross-compiling autotools