3

我想在 ChibiOS 上运行我的 C++ 代码,如果我用new deleteC 函数 malloc 和 free 替换,我可以编译和链接代码。但我仍然想解决这个问题。当我使用时new delete,我收到以下错误:

no memory region specified for loadable section `.ARM.extab'

这是链接脚本

    /*
 * BCM2835 memory setup.
 */
__und_stack_size__  = 0x0004;
__abt_stack_size__  = 0x0004;
__fiq_stack_size__  = 0x0010;
__irq_stack_size__  = 0x0080;
__svc_stack_size__  = 0x0004;
__sys_stack_size__  = 0x0400;
__stacks_total_size__   = __und_stack_size__ + __abt_stack_size__ + __fiq_stack_size__ + __irq_stack_size__ + __svc_stack_size__ + __sys_stack_size__;

MEMORY
{
     ram : org = 0x8000, len = 0x06000000 - 0x10021 
     extabram : org = 0x06008000 - 0x10020, len = 0x10000 - 0x20
}

__ram_start__       = ORIGIN(ram);
__ram_size__        = LENGTH(ram);
__ram_end__     = __ram_start__ + __ram_size__;

SECTIONS
{
    . = 0;

    .text : ALIGN(16) SUBALIGN(16)
    {
        _text = .;
        KEEP(*(vectors))
        *(.text)
        *(.text.*)
        *(.rodata)
        *(.rodata.*)
        *(.glue_7t)
        *(.glue_7)
        *(.gcc*)
        *(.ctors)
        *(.dtors)
    } > ram

    .ARM.extab : {*(.ARM.extab* .gnu.linkonce.armextab.*)} > extabram

    __exidx_start = .;
    .ARM.exidx : {*(.ARM.exidx* .gnu.linkonce.armexidx.*)} > ram
    __exidx_end = .;

    .eh_frame_hdr : {*(.eh_frame_hdr)}

    .eh_frame : ONLY_IF_RO {*(.eh_frame)}

    . = ALIGN(4);
    _etext = .;
    _textdata = _etext;

    .data :
    {
        _data = .;
        *(.data)
        . = ALIGN(4);
        *(.data.*)
        . = ALIGN(4);
        *(.ramtext)
        . = ALIGN(4);
        _edata = .;
    } > ram 

    .bss :
    {
        _bss_start = .;
        *(.bss)
        . = ALIGN(4);
        *(.bss.*)
        . = ALIGN(4);
        *(COMMON)
        . = ALIGN(4);
        _bss_end = .;
    } > ram    
}

PROVIDE(end = .);
_end = .;

__heap_base__              = _end;
__heap_end__               = __ram_end__ - __stacks_total_size__;
__main_thread_stack_base__ = __ram_end__ - __stacks_total_size__;

链接描述文件中缺少什么?


编辑 在我跟随 Chris Desjardins 回答后,我收到以下错误:

 Linking build/ch.elf
    /home/robu/CodeSourcery/Sourcery_CodeBench_Lite_for_ARM_EABI/bin/../lib/gcc/arm-none-eabi/4.7.2/../../../../arm-none-eabi/lib/libc.a(lib_a-abort.o): In function `abort':
    abort.c:(.text+0x10): undefined reference to `_exit'
    /home/robu/CodeSourcery/Sourcery_CodeBench_Lite_for_ARM_EABI/bin/../lib/gcc/arm-none-eabi/4.7.2/../../../../arm-none-eabi/lib/libc.a(lib_a-fstatr.o): In function `_fstat_r':
    fstatr.c:(.text+0x1c): undefined reference to `_fstat'
    /home/robu/CodeSourcery/Sourcery_CodeBench_Lite_for_ARM_EABI/bin/../lib/gcc/arm-none-eabi/4.7.2/../../../../arm-none-eabi/lib/libc.a(lib_a-sbrkr.o): In function `_sbrk_r':
    sbrkr.c:(.text+0x18): undefined reference to `_sbrk'
    /home/robu/CodeSourcery/Sourcery_CodeBench_Lite_for_ARM_EABI/bin/../lib/gcc/arm-none-eabi/4.7.2/../../../../arm-none-eabi/lib/libc.a(lib_a-signalr.o): In function `_kill_r':
    signalr.c:(.text+0x1c): undefined reference to `_kill'
    /home/robu/CodeSourcery/Sourcery_CodeBench_Lite_for_ARM_EABI/bin/../lib/gcc/arm-none-eabi/4.7.2/../../../../arm-none-eabi/lib/libc.a(lib_a-signalr.o): In function `_getpid_r':
    signalr.c:(.text+0x44): undefined reference to `_getpid'
    /home/robu/CodeSourcery/Sourcery_CodeBench_Lite_for_ARM_EABI/bin/../lib/gcc/arm-none-eabi/4.7.2/../../../../arm-none-eabi/lib/libc.a(lib_a-writer.o): In function `_write_r':
    writer.c:(.text+0x20): undefined reference to `_write'
    /home/robu/CodeSourcery/Sourcery_CodeBench_Lite_for_ARM_EABI/bin/../lib/gcc/arm-none-eabi/4.7.2/../../../../arm-none-eabi/lib/libc.a(lib_a-closer.o): In function `_close_r':
    closer.c:(.text+0x18): undefined reference to `_close'
    /home/robu/CodeSourcery/Sourcery_CodeBench_Lite_for_ARM_EABI/bin/../lib/gcc/arm-none-eabi/4.7.2/../../../../arm-none-eabi/lib/libc.a(lib_a-isattyr.o): In function `_isatty_r':
    isattyr.c:(.text+0x18): undefined reference to `_isatty'
    /home/robu/CodeSourcery/Sourcery_CodeBench_Lite_for_ARM_EABI/bin/../lib/gcc/arm-none-eabi/4.7.2/../../../../arm-none-eabi/lib/libc.a(lib_a-lseekr.o): In function `_lseek_r':
    lseekr.c:(.text+0x20): undefined reference to `_lseek'
    /home/robu/CodeSourcery/Sourcery_CodeBench_Lite_for_ARM_EABI/bin/../lib/gcc/arm-none-eabi/4.7.2/../../../../arm-none-eabi/lib/libc.a(lib_a-readr.o): In function `_read_r':
    readr.c:(.text+0x20): undefined reference to `_read'
    collect2: error: ld returned 1 exit status
    make: *** [build/ch.elf] Error 1
4

2 回答 2

1

似乎 ARM.extab 部分在内存中没有位置。在这个例子中,他们把它放在闪存中。

http://hertaville.com/2012/06/29/a-sample-linker-script/

但是你应该可以只为它雕刻一些内存,如下所示:

MEMORY
{
    ram : org = 0x8000, len = 0x06000000 - 0x10021 
    extabram : org = 0x06008000 - 0x10020, len = 0x10000 - 0x20
}

然后将 ARM.extab 部分放入新的 ram 区域:

.ARM.extab : {*(.ARM.extab* .gnu.linkonce.armextab.*)} > extabram

您也可以尝试将其放入普通的 ram 部分...

.ARM.extab : {*(.ARM.extab* .gnu.linkonce.armextab.*)} > ram
于 2012-11-29T12:17:41.797 回答
0

.ARM.extab 部分在需要异常支持时创建。

malloc和之间的区别之一new是 new 不能返回 NULL:它必须在内存分配失败的情况下抛出异常。

使用--force_new_nothrow选项编译会有帮助吗?

于 2012-11-29T12:09:36.440 回答