使用arm-linux-gnueabi-g ++ -o时的Segfault,没有-o没有问题

时间:2014-08-18 12:06:50

标签: c++ arm cross-compiling

我正在尝试交叉编译一些代码以在ARM Cortex A8上运行(AR.Drone 2.0,如果它有所不同)。

我在我的Virtualbox上安装了Ubuntu 12.04 LTS 32位(使用Windows 7 64位主机),我的交叉编译代码完全正常。

在另一台计算机上,我安装了相同版本的Ubuntu(没有Virtualbox),但我遇到了奇怪的错误。我得到的最小的代码片段表明问题是一个“hello world”程序(如果需要,我可以在这里显示代码):

  • 我执行了: sudo apt-get install g ++ gcc-arm-linux-gnueabi g ++ - arm-linux-gnueabi
  • 当我运行 arm-linux-gnueabi-g ++ hello.cpp 时,交叉编译的代码(a.out)在ARM上运行良好。
  • 当我运行 arm-linux-gnueabi-g ++ -o hello hello.cpp 时,我在ARM上执行hello时遇到段错误。
  • 我在使用Virtualbox编译时比较了文件hello read-elf -A hello 的输出,但它们看起来完全相同。
  • 我在ARM上没有gdb,所以我无法通过gdb来找出段错误的来源。

非常感谢任何想法/解决方案。我没有在我的Virtualbox上设置任何特殊功能,所以我很困惑为什么没有Virtualbox的PC无法正确交叉编译。

3 个答案:

答案 0 :(得分:3)

如果您使用的是Filezilla等,请确保您没有使用“自动”作为传输模式。选择“二进制”,我有一个同样的问题,将一个简单的hello world程序从我的ubuntu转移到arm目标(Xilinx Zynq),经过几个小时的调查,我在ubuntu和目标上检查了可执行文件的md5,发现它们是不同。

答案 1 :(得分:0)

您是否尝试使用gdb或类似的方法调试seg故障?

以调试模式构建代码(输出调试符号),并按照here

所述的步骤进行操作

调用堆栈特别有用。

您的环境中可能缺少运行时依赖性。

答案 2 :(得分:0)

即使在两台机器(VM和直接安装)上,我也面临同样的问题,但我还是无法解决它。

但是,以下“解决方法”对我有用(这实际上是通过 Mentor Graphics 安装ARM工具链,以前称为 Code Sourcery )来交叉编译AR无人机2):

  • here下载“arm-2012.03-57-arm-none-linux-gnueabi.bin”
  • 通过键入来安装(如果要安装到系统目录,则需要sudo

    $ chmod +x arm-2012.03-57-arm-none-linux-gnueabi.bin
    $ ./arm-2012.03-57-arm-none-linux-gnueabi.bin
    

    并逐步完成(图形)设置。

  • 最后,使用位于

    中的二进制文件编译源代码
    $INSTALL_PATH/CodeSourcery/Sourcery_CodeBench_Lite_for_ARM_GNU_Linux/bin/
    

    例如:

    ./arm-none-linux-gnueabi-gcc -march=armv7-a hello.c -o helloworld
    

    生成的二进制文件应该是可执行的,没有任何问题。 ; - )

为了完整性/所有其他读者:您可以使用连接到192.168.1.1的任何FTP客户端(例如,ftp,WinSCP,FileZilla,...)将二进制文件复制到Drone(假设您的主机已连接到Drone创建的WLAN)。要执行它,请将可执行位设置为chmod +x helloworld并运行./helloworld

BTW:AR Drone 2上没有“调试器”,但您可以通过在设备上启动gdbserver来使用gdb远程调试(此工具已在设备上),请参阅(例如){ {3}}