1

リンカースクリプトに次の行があります

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","ax",%progbits

そうして初めて、リンカは正しく動作します。

4

1 に答える 1

1

だからここに私が見つけたものがあります。おそらく、これにより、イライラする何時間ものデバッグから誰かを救うことができるでしょう。

私の主な問題は、SRAM 空間にリンクし、フラッシュ空間からロードする必要のあるアセンブリ コードがあったことです。したがって、VMA は SRAM アドレスで、LMA はフラッシュ アドレスである必要がありました。

過去に、私は常にacファイルで定義された関数/データに対して上記を達成することに成功しました. セクション属性を割り当て、リンカー スクリプトを適切に変更するだけで済みます。

推論 1: リンカーは、セクション属性を使用して異なる名前を付けることができますが、標準の TEXT および DATA セクションに対して異なる 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
    

より良い説明/別の根本原因があるかもしれません。しかし、これは確かに私の一日を救いました。

于 2012-12-08T03:35:05.193 に答える