在--gc-sections之后更新链接器变量

时间:2015-03-03 06:56:09

标签: linux gcc linker arm linker-scripts

我在cortex-a9板上写了一个小二进制文件,并定义了一个像这样的链接器脚本:

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之前的值被处理(我在代码中打印它并检查ld标志):

  

arm-linux-gnueabihf-gcc -mcpu = cortex-a7 -msoft-float -nostdlib   -Wl, - gc-sections -Wl, - print-gc-sections -Wl,-Ttext,0x04000000 -T csrvisor.lds -Wl,-Map,binary.map

__heap_start删除未使用的部分后,有人知道如何将--gc-sections更改为正确的值吗?

1 个答案:

答案 0 :(得分:1)

  • 检查编译器标志:它们真的包含-ffunction-sections -fdata-sections吗?

  • 堆正常(在您的情况下也是)在.bss部分之后开始。因此,对于堆的开始,链接器脚本看起来很好

  • 检查链接器是否确实删除了未使用的变量 - 如果它只删除未使用的文本部分,则__heap_start的值不会被取消变化

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

数据(初始化和未初始化)将(最终)在RAM中出现。如果在那里垃圾收集,它将影响你的堆。因此,请检查是否确实有垃圾收集删除的变量。

关于链接描述文件

  • 没有KEEP声明。通常类似于重置处理程序,main等。人。不得通过链接器垃圾收集

  • 删除
  • 您的数据部分未定义初始值的处理。

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

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

目标区域的示例:

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

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