2015-03-03 84 views
0

我写的cortex-A9主板小二进制文件,定义链接描述是这样的:更新链接变量--gc截面

SECTIONS 
{ 
    .text : 
    { 
     __text = . ; 
     *(.vector) 
     *(.text) 
     *(.text.*) 
    } 

    .rodata : 
    { 
     *(.rodata) 
     *(.rodata.*) 
    } 

    .data : { 
     __data_start = . ; 
     *(.data) 
     *(.data.*) 
    } 
    . = ALIGN(4); 
    __bss_start = . ; 
    .bss  : 
    { 
     *(.bss) 
     *(.bss.*) 
     *(COMMON) 
    . = ALIGN(4); 
    } 
    __bss_end = .; 

    . = ALIGN(4); 
    __heap_start = .; 
    . = . + 0x1000;  
    . = ALIGN(4); 
    __heap_end = .; 
    _end = .  ; 
    PROVIDE (end = .) ; 
} 

但似乎后--gc-sections工作,并删除未使用的部分,在__heap_start仍然--gc-sections前值获得workked(我打印出来的代码,并检查LD标志):

ARM-Linux的gnueabihf-GCC -mcpu =的Cortex-A7 -msoft浮动-nostdlib 轮候册, --gc-sections -Wl, - print-gc-sections -Wl,-Ttext,0x04000000 -T csrvisor.ld小号轮候册,-Map,binary.map

任何人知道如何改变__heap_start--gc-sections删除未使用的部分,以正确的价值?

回答

1
  • 检查编译标志:他们是否真的含有-ffunction-sections -fdata-sections

  • 堆正常(并且在你的情况下)在.bss部分之后开始。所以,作为堆的开始你的链接脚本看起来不错

  • 检查链接真的删除未使用的变量 - 如果它只是删除未使用文字部分,为__heap_start值不会改变。

代码,只读数据,初始化数据等。人。通常进入闪光灯。如果垃圾收集在那里,它不会影响你的堆。

数据(初始化和未初始化)将(最终)在RAM中调出。如果垃圾收集在那里,它会影响你的堆。所以检查一下你是否真的有垃圾回收被删除的变量。

至于你的链接脚本

  • 没有KEEP声明。通常像重置处理程序,主要等。人。不能被链接器垃圾回收删除

  • 您的数据部分没有定义初始值的处理。

  • 您的链接描述文件不包含区域声明(MEMORY)。检查应用哪些默认值

  • 您的部分没有目标区域:再次检查您的案例中适用的默认值。

例子与目标区域:

.rodata : 
{ 
    *(.rodata) 
    *(.rodata.*) 
} >rom 

.data : { 
    __data_start = . ; 
    *(.data) 
    *(.data.*) 
} >ram 
+0

我会检查你的意见,谢谢。 – akewart 2015-03-03 10:19:22