运行arm-elf-gcc编译代码时出现seg错误

时间:2010-11-09 12:19:19

标签: macos embedded arm elf

使用MacPorts我刚刚将arm-elf-gcc安装到我的MacBook Pro上。这完美无缺,一切似乎运行良好。

然而,在用C和C ++编译一个简单的hello world测试程序并尝试在目标板(运行Debian Linux的基于ARM9的板)上运行之后,它们会立即出错。

我有点担心如何调试这个,因为目标板有可用的工具和没有gdb。我已经使用Linux托管的交叉编译器成功构建并运行其他代码,因此它应该可以工作。

有什么想法吗?

根据我建立并运行gdbserver的建议,我在主机上的gdb中获得以下内容:

编程接收信号SIGSEGV,分段故障。 0x00000000在? ()

我认为这可能是标准c库的一个问题所以我删除了任何调用并且只有一个空的main返回0,它是用 -Wall -g hello-arm.cpp -static编译的。作为测试,我使用Linux托管的交叉编译器编译了相同的源代码,它运行并退出正常。我能看到的唯一区别是Linux编译版本的大小超过了文件命令输出的两倍:

arm-elf-gcc:ELF 32位LSB可执行文件,ARM,版本1,静态链接,未剥离

arm - * - linux:ELF 32位LSB可执行文件,ARM,版本1,静态链接,适用于GNU / Linux 2.4.18,未剥离

2 个答案:

答案 0 :(得分:2)

在这种情况下,通常的调试方法是在目标板上运行gdbserver,并使用在主机上运行的gdb连接到它(通过以太网)。

或者,您可以尝试比较Mac编译的“Hello World”程序和(工作)Linux编译程序中的程序集,看看有什么不同。

答案 1 :(得分:1)

经过几天的挖掘后,我开始更多地了解嵌入式编译器。我不太确定通过MacPorts安装的arm-elf-gcc与我在Linux机器上安装的arm-unknown-linux工具链之间的区别。我刚刚看到一个标题为“An introduction to the GNU compiler”的pdf,其中包含以下段落:

  

重要:使用GNU编译器   创建你的可执行文件并不完全   与使用GNU Linker相同,   arm-elf-ld,你自己。原因是   那个GNU编译器是自动的   链接了许多标准系统   库到您的可执行文件中这些   库允许您的程序   与操作系统交互   使用标准C库函数,   使用某些语言功能和   操作(如分工)等   上。如果你想看到究竟是哪个   图书馆被链接到   可执行文件,你应该通过   详细的旗帜   -v到编译器。

     

这具有重要意义   嵌入式系统!这样的系统没有   通常有一个操作系统。   这意味着在系统中进行链接   图书馆几乎总是如此   毫无意义:如果没有经营   系统,例如,然后调用   标准的printf函数没有   很有道理。

因此,当我稍后回到我的开发机器时,我将确定与Linux构建链接的库,并将它们添加到arm-elf-gcc构建中。

当我有更多信息时,我会更新这个,但我只想记录我的发现,以防任何其他人遇到这些问题。