在嵌入式设备上使用new或malloc导致的段错误

时间:2012-01-21 21:45:58

标签: c++ c embedded arm

我正在尝试使用C++而不是C为我的MIPS based embedded device构建我的应用程序。首先,我遇到了一个链接问题,您可以看到here。这个问题已修复,我可以成功构建我的应用程序。在我的代码中,我使用malloc函数进行内存分配,但是当我调用此函数时,我收到"Segment Fault"消息。我将malloc替换为new运算符,但结果相同。有关更多信息,请参阅下面的代码:

    int main(int argc, char** argv)
    {
            char* str = (char*)malloc(10 * sizeof(char));      //or   char* str = new char[10];
            strcpy(str, "Hello");
            return 0;
    }

执行第3行并调用malloc函数时,屏幕上会显示"Segment Fault"消息。如果我使用mipsel-elf-gcc代替mipsel-elf-g++,我就没有这个问题。

这里有什么问题?

2 个答案:

答案 0 :(得分:1)

您写道您的目标平台是ARMv7处理器,但您的交叉编译器是一个mipsel编译器。 您应该下载ARM的工具链。来自Mentor Graphics的Sourcery Lite工具链相当不错。

例如,您可以尝试使用arm-2011.03-41编译程序。

答案 1 :(得分:1)

malloc()的库代码可能是成熟和正确的。 GNU工具链库需要一个特定于目标的移植层来将库粘贴到目标硬件和/或操作系统。对于malloc()和C ++ new以及它们的变体,相关的系统代码在sbrk()(或sbrk_r()中用于重入,尽管这通常本身就是一个包装器aropund sbrk())。

工具链供应商的sbrk()实现可能是一个通用的存根,而不是针对您的特定目标。您需要为运行时环境实现它。