2012-12-07 44 views
1

我有以下線在我的鏈接腳本GNU鏈接和鏈接描述:鏈接器不產生正確的LMA

JumpTable ABSOLUTE(0x2000000C): AT(eROData) 
{ 
    JumpTableStart = .; 
    *(.JumpSection); 
    . = ALIGN(4); 
    JumpTableEnd = .; 
} > SRAM 

eROData是從閃存中的地址,假定值0x1000xxxx

鏈接之後,我請注意,鏈接器將VMA和LMA分配到JumpTable部分。 這是列表文件中的列表。

2 .rodata  00000004 10001214 10001214 00001214 2**2 

       CONTENTS, ALLOC, LOAD, READONLY, DATA 

3 JumpTable  00000140 2000000c 2000000c 00008954 2**2 

       CONTENTS, READONLY 

沒有這樣的問題.data部分。

這是一個已知的GNU鏈接器問題嗎?

編輯: 我注意到,如果部分「.JumpSection」在C文件中定義,LMA被正確分配。

我正面臨這個問題,因爲該部分是在程序集文件中定義的。

你以前遇到過這個問題嗎?

編輯 - 解決方案: 事實證明,.JumpSection必須用正確的屬性進行定義: .section僞「.JumpSection」,‘斧’,PROGBITS%

只有這樣,連接器的行爲正確。

回答

1

所以這裏是我發現的。也許這可以幫助人們避免幾個令人沮喪的調試問題。

我的主要問題是有一段彙編代碼需要鏈接到SRAM空間並從閃存空間加載。所以VMA必須是SRAM地址,而LMA是閃存地址。

在過去,我總是成功完成上面的c文件中定義的函數/數據。我需要做的就是分配一個section屬性並適當地修改鏈接器腳本。

INFERENCE 1:鏈接器允許標準TEXT和DATA部分使用不同的LMA,儘管使用section屬性可以命名爲不同的LMA。

在裝配文件中試圖做到這一點時,沒有這種運氣。鏈接器拒絕確認上面定義的輸入節.JumpTable實際上是用戶定義的TEXT節。

然後將溶液

  1. 要移動彙編代碼到一個新的文件JumpTable.S。

  2. 重命名輸入部分.JumpTable .text區段

  3. 修改連接文件如下

    .text : 
    
    { 
    
    *(EXCLUDE_FILE(*JumpTable.o) .text); /* Exclude .text of JumpTable.o and place others */ 
    
    } > FLASH 
    
    
    JumpTable ABSOLUTE(0x2000000C) : AT (eROData) /* Link to SRAM and Load after const data */ 
    
    { 
    
        JumpTableStart = .; 
    
        *JumpTable.o(.text); /* Place .text of JumpTable.o into JumpTable output section) */ 
    
        JumpTableEnd = .; 
    
    } > SRAM 
    

也許有一個更好的解釋/另一根源。但是這確實節省了我的一天。