2010-11-09 22 views
3

使用MacPorts我刚刚在我的MacBook Pro上安装了arm-elf-gcc。这工作完美无缺,似乎都运行良好。运行arm-elf-gcc编译代码时出现seg fault

但是,在C和C++编译一个简单的hello world测试程序并尝试在目标板(运行Debian Linux的基于ARM9的电路板)上运行后,它们立即发生故障。

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

任何想法?

继我已经建立的建议和运行gdbserver的,我得到的主机在gdb以下几点:

计划接收信号SIGSEGV,分割过错。 0x00000000在? ()

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

arm-elf-gcc:ELF 32位LSB可执行文件,ARM版本1静态链接,而不是汽提

臂 - * - Linux操作系统:ELF 32位LSB的可执行文件,ARM,版本1,静态链接,用于GNU/Linux 2.4.18,不剥离

回答

2

通常的调试的方法在这种情况下,要在目标板上运行gdbserver,并使用在主机上运行的gdb连接到它(通过以太网)。或者,您可以尝试在Mac编译的“Hello World”程序和(工作)Linux编译的程序中比较程序集,以查看不同的程序组。

1

在挖掘了几天后,我开始对嵌入式编译器有所了解。我并不确定通过MacPorts安装的arm-elf-gcc与我在Linux机器上安装的arm-unknown-linux工具链之间的区别。

重要:使用GNU编译器 创建可执行文件是不太 一样使用GNU链接器, 臂elf-我只是碰到标题为“An introduction to the GNU compiler” PDF文件包含以下段落来了ld,你自己。原因是 ,GNU编译器自动将 链接到一些标准的系统库中到您的可执行文件中。这些 库允许您的程序以 与操作系统交互,使用标准C库函数 ,使用某些语言功能和 操作(如除法)等等 。如果您希望看到哪些 库正在链接到 可执行文件中,则应将 详细标志-12v传递给编译器。

这对于嵌入式系统 有重要意义!这种系统通常不具有操作系统。 这意味着在系统连接 库几乎总是 意义:如果没有操作系统 系统,例如,然后调用 标准printf函数不作 多大意义。

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

我会在有更多信息时更新此信息,但我只是想记录下我的发现,以防其他人遇到这些问题。

+0

我现在正在经历同样的问题。你有没有得到答案? – Jim 2011-11-03 16:59:40

+0

我并没有真正了解这一点,我认为这更多的是因为我对这个问题的误解。不过,我通过从http://www.obdev.at/products/crosspack/index.html安装Crosspack ARM获得了可用的ARM交叉编译器。 – Patrick 2011-11-18 00:15:59