gcc链接器巨型bin文件

时间:2015-08-03 09:36:12

标签: linux gcc makefile

我正在使用和ARM官方开发环境RVDS的旧版本,目前我想切换到linux gcc工具链。

所以我想写一个简单的hello world在我们自己的主板上运行,从UART打印。但是链接器和objcopy困住了我。

这是我的LD文件:

MEMORY
{
  rom (rx) : ORIGIN = 0, LENGTH = 128K
  ram (rwx) : ORIGIN = 0x60000000, LENGTH = 128K
}

SECTIONS
{
    . = 0x0;
    .text : {
        *(vectors)
        *(.text)
        *(.rodata)
    }
    . = 0x60000000;

    .data : {
        *(.data)
    }
    .bss : {
        *(.bss)
    }
}

make之后,它会生成一个大约1.6G的巨型bin文件,大小只有0x60000000。

我该如何解决这个问题?非常感谢。

2 个答案:

答案 0 :(得分:2)

数据部分应位于RAM中。更改链接描述文件:

/*  . = 0x60000000; removed */

.data : {
    *(.data)
} >RAM

.bss : {
    *(.bss)
} >RAM

您的启动代码应将数据从ROM复制到RAM。为此,它需要初始化值的地址以及运行时数据应存在的位置。

再次更改脚本:

/* used by the startup to initialize data */
_sidata = .;

.data : AT( _sidata )
{
    _sdata = .;
    *(.data)
    _edata = .;
} >RAM

.bss : {
    _sbss = .;
    *(.bss)
    _ebss = .;
} >RAM

添加代码

/* Copy the data segment initializers from flash to SRAM */
  movs  r1, #0
  b  LoopCopyDataInit

CopyDataInit:
  ldr  r3, =_sidata
  ldr  r3, [r3, r1]
  str  r3, [r0, r1]
  adds  r1, r1, #4

LoopCopyDataInit:
  ldr  r0, =_sdata
  ldr  r3, =_edata
  adds  r2, r0, r1
  cmp  r2, r3
  bcc  CopyDataInit

.bss部分添加类似的代码。

  ldr  r2, =_sbss
  b  LoopFillZerobss
/* Zero fill the bss segment. */
FillZerobss:
  movs  r3, #0
  str  r3, [r2], #4

LoopFillZerobss:
  ldr  r3, = _ebss
  cmp  r2, r3
  bcc  FillZerobss

答案 1 :(得分:1)

当我改为这些编译器设置时,巨型文件就消失了:

CC = arm-none-eabi-gcc
LD = arm-none-eabi-ld
OBJCP = arm-none-eabi-objcopy

CFLAGS += -mcpu=arm1176jz-s -mthumb -mlittle-endian
CFLAGS += -ffunction-sections -fdata-sections
CFLAGS += -fshort-enums -fomit-frame-pointer -fno-strict-aliasing
CFLAGS += -Wall -std=c99

LFLAGS += -nostartfiles
LFLAGS += -T my_ld.ld

CPFLAGS = -O binary