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

3

我正在尝试使用C++而不是C来构建我的MIPS嵌入式设备应用程序。首先,我遇到了链接问题,你可以在这里看到。这个问题已经解决,我成功地构建了我的应用程序。在我的代码中,我使用malloc函数进行内存分配,但是当我调用这个函数时,我会收到"Segment Fault"的消息。我用new运算符替换了malloc,但结果仍然相同。更多信息请参见下面的代码:

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

当执行第三行并调用malloc函数时,屏幕上出现了"Segment Fault"的消息。如果我使用mipsel-elf-gcc而不是mipsel-elf-g++,就不会出现这个问题。
这里出了什么问题?

3
(1) 嵌入式系统中不建议混用 Embeddedmalloc。 (2) 为何使用 mipsel-elf-g++ 编译针对 ARM7 设备的代码? - Ben Voigt
  1. “嵌入式和 malloc 不相容”是什么意思?
  2. 因为制造商工具链使用 mipsel-elf-gcc,所以我决定使用 mipsel-elf-g++。
- Mir Milad Hosseiny
2
@Ben:在资源受限的系统中使用动态内存分配可能不是一个好主意,在实时关键代码中使用它是一个坏主意。但是一般地认为它是个坏主意有点教条主义。 - Clifford
1
mipsel前缀是指使用小端字节顺序的MIPS架构。如果它能工作,要么您没有使用建议的工具链,要么它不是ARM7,或者armelf工具链被错误地重命名了。试图用如此明显的歧义来回答这个问题可能是毫无意义的。首先修复不准确性。 - Clifford
1
因为缺乏足够的细节以至于无法得出明确的答案,所以被放弃了。投票关闭此问题,因为它过于局限。 - Chris Stratton
显示剩余4条评论
2个回答

1

你写道你的目标平台是ARMv7处理器,但你的交叉编译器是mipsel编译器。 你应该下载一个适用于ARM的工具链。Mentor Graphics的Sourcery Lite工具链非常不错。

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


1

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

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


如果我理解正确的话,我应该在我的项目中自己实现mallocnew。是这样吗? - Mir Milad Hosseiny
@Mir:那么你完全误解了;那不是我建议的。正确实现malloc和所有new运算符重载并不是一个轻松的任务。你的工具链使用什么C库?它是针对操作系统还是裸机目标?我问这些问题,但某种程度上怀疑你不知道答案,因为你认为你在ARM7上使用MIPS编译器,甚至还没有澄清这个混淆!例如,Newlib的一个sbrk实现在这里给出。 - Clifford
@Califford:首先,对不起,因为我之前认为我的板子CPU是ARM7,但现在我明白它是基于MIPS的CPU。 我正在使用Cygwin,并且我认为它使用了libc。我的设备有一个由制造商开发的操作系统,不是标准的操作系统。 - Mir Milad Hosseiny
@Mir:Cygwin 将作为开发环境,而非运行时环境。Cygwin 使用 GNU libc,但您的运行时环境可能不使用。libc 只是标准库文件的名称;GCC 不管它是否是 GNU libc、Newlib libc 或其他库都使用该名称。操作系统和制造商是重要信息,所以您应该命名它们。如果操作系统不符合 POSIX 标准,那么您很可能不在使用 GNU libc。 - Clifford
查看标准头文件,这可能会提供库源代码的线索。但是请注意,Cygwin头文件与交叉编译器头文件不同。确保您正在查看目标构建使用的实际头文件。 - Clifford
我找到了问题,我应该在代码开头初始化堆大小。 - Mir Milad Hosseiny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接