首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gcc链接器巨型箱文件

gcc链接器巨型箱文件
EN

Stack Overflow用户
提问于 2015-08-03 09:36:11
回答 2查看 138关注 0票数 0

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

因此,我想写一个简单的你好世界运行在我们自己的板上,打印从UART。但是链接器和讣告卡住了我。

这是我的LD文件:

代码语言:javascript
复制
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。

我怎样才能解决这个问题?非常感谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-04 10:31:51

当我更改到以下编译器设置时,这个巨大的文件就消失了:

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2015-08-03 11:18:58

数据部分应该位于RAM中。更改链接器脚本:

代码语言:javascript
复制
/*  . = 0x60000000; removed */

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

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

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

再次更改您的脚本:

代码语言:javascript
复制
/* used by the startup to initialize data */
_sidata = .;

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

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

添加代码

代码语言:javascript
复制
/* 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部分添加类似的代码。

代码语言:javascript
复制
  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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31784002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档