2015-03-03 20 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