与arm-none-eabi-ld链接时未定义的引用`calloc'

时间:2015-10-20 04:58:56

标签: c gcc arm

我遇到的错误无疑是由于我对链接器如何工作的限制。我编写的一些ANSI C代码在我的OS X框上编译和链接完全无法在为ARM交叉编译时与arm-none-eabi-ld链接。

以下是干净make--verboseld)的结果:

arm-none-eabi-gcc -o build/fft.o src/fft.c -g -mthumb -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=softfp -Os -ffunction-sections -fdata-sections -MD -std=c99 -Wall -pedantic -DPART_TM4C123GH6PM -c -I../tivaware -DTARGET_IS_BLIZZARD_RA1
arm-none-eabi-gcc -o build/main.o src/main.c -g -mthumb -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=softfp -Os -ffunction-sections -fdata-sections -MD -std=c99 -Wall -pedantic -DPART_TM4C123GH6PM -c -I../tivaware -DTARGET_IS_BLIZZARD_RA1
arm-none-eabi-ld -o build/a.out build/fft.o build/main.o --verbose -T TM4C123GH6PM.ld --entry main --gc-sections
GNU ld (32-bit ARM EABI Toolchain JBS-FLOAT_IO-SGXXLITE_ML-2014.05-28-v2013.05-36-g3f93944) 2.24.51.20140217
  Supported emulations:
   armelf
opened script file TM4C123GH6PM.ld
using external linker script:
==================================================
MEMORY
{
    FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000
    SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0X00008000
}

SECTIONS
{
    /* code */
    .text :
    {
        _text = .;
        /* ensure ISR vectors are not removed by linker */
        KEEP(*(.isr_vector))
        *(.text*)
        *(.rodata*)
        _etext = .;
    } > FLASH

    /* static data */
    .data : AT(ADDR(.text) + SIZEOF(.text))
    {
        _data = .;
        *(vtable)
        *(.data*)
        _edata = .;
    } > SRAM

    /* static uninitialized data */
    .bss :
    {
        _bss = .;
        *(.bss*)
        *(COMMON)
        _ebss = .;
    } > SRAM

}

==================================================
attempt to open build/fft.o succeeded
build/fft.o
attempt to open build/main.o succeeded
build/main.o
build/fft.o: In function `dft':
/path/src/fft.c:97: undefined reference to `calloc'

还有许多其他未定义的符号(__aeabi_dadd__muldc3),为简洁起见,我将其截断。

1 个答案:

答案 0 :(得分:1)

微控制器通常(实际原因)未配置动态内存分配功能 所以,malloc,calloc,free将无法使用。

建议:使用静态数组来分配内存。

即使在阅读此内容后您需要动态内存分配,您也可以使用newlibc
但请注意,如果您的堆和堆栈重叠,您将遇到问题。