我在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
更改为正确的值吗?
答案 0 :(得分:1)
检查编译器标志:它们真的包含-ffunction-sections -fdata-sections
吗?
堆正常(在您的情况下也是)在.bss
部分之后开始。因此,对于堆的开始,链接器脚本看起来很好
检查链接器是否确实删除了未使用的变量 - 如果它只删除未使用的文本部分,则__heap_start
的值不会被取消变化
代码,只读数据,初始化数据等。人。通常进入闪光灯。如果在那里收集垃圾,它就不会影响你的堆。
数据(初始化和未初始化)将(最终)在RAM中出现。如果在那里垃圾收集,它将影响你的堆。因此,请检查是否确实有垃圾收集删除的变量。
关于链接描述文件
没有KEEP
声明。通常类似于重置处理程序,main等。人。不得通过链接器垃圾收集
您的数据部分未定义初始值的处理。
您的链接描述文件不包含区域声明(MEMORY
)。检查适用的默认值
您的部分没有目标区域:再次检查您的情况适用的默认值。
目标区域的示例:
.rodata :
{
*(.rodata)
*(.rodata.*)
} >rom
.data : {
__data_start = . ;
*(.data)
*(.data.*)
} >ram