Raspi的交叉编译 - 执行程序结束于"分段错误"

时间:2016-08-17 16:57:08

标签: c++ linux compilation raspberry-pi cross-compiling

我有一个自编程序,我想从我的x86机器上为Raspberry Pi构建。我使用eclipse生成的makefile并不能改变这个东西。

我已经阅读了本教程的CC for raspi:Hackaday-Link。因为raspi也安装了gcc版本4.9,我也尝试使用这个版本的交叉编译器。问题也存在于这个问候世界计划中:

#include <iostream>
using namespace std;

int main(int argc, char *argv[])
{
    cout << "hello world!" << endl;
}

直接在raspi上编译并运行它时,输出为hello world!。好没关系。 但是当用arm-linux-gnueabihf-g++-4.9的4.9版进行交叉编译时,然后将其scp到raspi,使其可执行并运行它,./hello_world的输出为Segmentation fault。执行sudo ./hello_world时没有输出。

我试图获取有关这些文件的一些信息,并看到本地上的raspi编译程序输出了:

pi@raspberrypi:~ $ file hello_world
hello_world: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 2.6.32, BuildID[sha1]=41161ae762d940b12c3313ca065a3badd284f6d3, not stripped

和交叉编译版本输出

pi@raspberrypi:~ $ file hello_world
hello_world: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 3.2.0, BuildID[sha1]=4f1f4fb86710ef8130f148dc5adae1c0c18092fd, not stripped

谁能告诉我问题是什么以及如何解决?

1 个答案:

答案 0 :(得分:1)

工具链编译器arm-linux-gnueabihf-gcc可以有不同的默认参数,可以运行:

 arm-linux-gnueabihf-gcc -Q --help=target

Raspberry Stretch上安装的编译器(我将仅保留基本信息):

-march= armv6 -marm [enabled] -mfloat-abi= hard -mfp16-format= none -mfpu= vfp

Stretch默认交叉编译器:

-march= armv7-a -marm [disabled] -mfloat-abi= hard -mfp16-format= none -mfpu= vfpv3-d16

现在你看到了架构的不同之处。因此,对于使用交叉编译器的sompile,需要设置march以匹配您想要的CPU。 另请注意,Debian交叉编译器默认发出Thumb代码,Raspberry Stretch发出ARM代码

我建议您在较新的CPU系列中进行交叉编译,而您的设备不支持它。