0

我在 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

4

1 回答 1

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

  • 堆通常(在您的情况下也是如此)在该.bss部分之后立即开始。因此,对于堆的开始,您的链接器脚本看起来不错

  • 检查链接器是否真的删除了未使用的变量- 如果它只删除未使用的文本部分,则 for 的值__heap_start不会改变。

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

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

至于你的链接器脚本

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

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

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

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

目标区域示例:

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

.data   :  {
    __data_start = . ;
    *(.data)
    *(.data.*)
} >ram
于 2015-03-03T08:35:21.630 回答