用于ARM的Eclipse和Codesourcery生成非常大的二进制文件

时间:2014-09-12 05:45:11

标签: eclipse arm cross-compiling binaries

我现在正在为TM4C1231H6PZ编写固件。前段时间我帮助设置IDE和工具链,为我的项目生成整齐且工作的二进制文件,大约8 kB。之后,我做了一些目录移动等等,现在同一个IDE,使用相同的项目(我已经从归档中恢复了整个项目目录)生成二进制520 Mb大,这显然是错误的。

查看新的二进制文件,我看到有代码从00000000到0000079b,之后只有NULL,然后是20000000到2000002b的一些代码。我相信它必须是一些用于SRAM的代码,但我不知道如何处理它。我试图从20000000开始删除代码,但生成的二进制文件在MCU上不起作用。

有人可以帮我修复我的IDE +工具链,像以前一样生成普通的二进制文件吗?

我使用Eclipse Kepler 2.0.2,用于ARM工具链的代码源Lite(arm-2013.11-24-arm-none-eabi.exe安装程序)和TivaWare(SW-TM4C-2.1.0.12573.exe)。

这是我的链接器脚本文件:

MEMORY
{
    FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 16K
    SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 32K
}

SECTIONS
{
    .text :
    {
        _text = .;
        KEEP(*(.isr_vector))
        *(.text*)
        *(.rodata)
        *(.rodata*)
        _etext = .;
    } > FLASH

    /* C++ initialization and finalization data */
    .preinit_array :
    {
        PROVIDE_HIDDEN (__preinit_array_start = .);
        KEEP (*(.preinit_array*))
        PROVIDE_HIDDEN (__preinit_array_end = .);
    } >FLASH
    .init_array :
    {
        PROVIDE_HIDDEN (__init_array_start = .);
        KEEP (*(SORT(.init_array.*)))
        KEEP (*(.init_array*))
        PROVIDE_HIDDEN (__init_array_end = .);
    } >FLASH
    .fini_array :
    {
        PROVIDE_HIDDEN (__fini_array_start = .);
        KEEP (*(.fini_array*))
        KEEP (*(SORT(.fini_array.*)))
        PROVIDE_HIDDEN (__fini_array_end = .);
    } >FLASH

    .data : AT(ADDR(.text) + SIZEOF(.text) + SIZEOF(.preinit_array) + SIZEOF(.init_array) + SIZEOF(.fini_array))
    {
        . = ALIGN(4);
        _data = .;
        *(.data)
        *(.data*)
        . = ALIGN(4);
        _edata = .;
    } > SRAM

    . = ALIGN(4);
    .bss :
    {
        _bss = .;
        *(.bss*)
        *(COMMON)
        . = ALIGN(4);
        _ebss = .;
    } > SRAM
}

1 个答案:

答案 0 :(得分:0)

某处您的代码包含要放入RAM的初始值或程序代码。您需要检查链接器映射文件以找出该段的名称。

让我们说,你会找到

.ramfunc  0x123
    0x20000000

在这种情况下,您需要通过添加

将此部分添加到.data细分中
*(.data)
*(.data*)
*(.ramfunc) <-- this line

到链接器脚本。

在调用main()之前,数据段将被置于闪存中并由初始化代码复制到RAM中。