11

ARM プログラミングの学習を始めたばかりで、やや厄介な問題に悩まされています。ソースをコンパイルするために使用しているツールチェーンは Sourcery CodeBench Lite 2013.05-23 です (ここで見つけることができます: https://sourcery.mentor.com/GNUToolchain/release2449 )

必要なのは、GCC、LD、または OBJCOPY に、「main」関数のコンパイル済みバイトコードを .text セクションの先頭に配置するように指示することです。

これを達成する方法はありますか?(おそらくリンカースクリプトを介して?)

ありがとうございました

4

3 に答える 3

16

問題を解決しました。それに直面する人のために:

  • GCC でコンパイルする場合、コマンドラインに-ffunction-sectionsオプションを追加します。これにより、GCC に各関数を個別のセクションに配置するように指示されます。セクション名の形式は、#なしの.text.#function name#になります(つまり、関数が .text セクションに属している場合 [デフォルトでは true ])。
  • 次に、リンカー スクリプトを使用して、これらの「関数セクション」を最終的な大きな .text セクションに並べます。例として、main関数を .text セクションの先頭に配置すると、LD スクリプトはおおよそ次のようになります。

    ENTRY(main)
    SECTIONS
    {
        .text :
        {
            *(.text.main);
            *(.text*);
        }
    }
    
于 2013-10-22T09:57:49.560 に答える
3

まず、次のように呼び出して、gcc の既定のリンカー スクリプトで .text セクションがどのように定義されているかを確認します (独自に作成する必要はありません)。

gcc -Wl,-verbose

これにより、デフォルトのリンカー スクリプトが出力されます。私は .text セクションについてこれを示しています:

/* text: Program code section */
  .text : 
  {
    *(.text)
    *(.text.*)
    *(.gnu.linkonce.t.*)
  }

したがって、「メイン」関数を .text セクションの最初にする (残りを連続させる) には、他のすべての関数に「セクション」属性を設定する必要があります。例えば:

void main(void);
void funct1(....) __attribute__ ((section (".text.A")));
void funct2(....) __attribute__ ((section (".text.A")));
void funct3(....) __attribute__ ((section (".text.A")));

関数プロトタイプに「属性を付ける」だけで十分です。そうすれば、今コンパイルすると、「メイン」関数が「.text」セクションの最初の関数になり、他のすべての関数はすぐに連続するアドレスに続きます。

「.text」セクション (つまり「main」関数) を特定のアドレス (0x1000 など) に配置する場合は、次のようにリンクすることを忘れないでください。

gcc .... -Wl,-Ttext=0x1000
于 2015-01-21T20:31:49.803 に答える
1

を使用して、「メイン」を独自のセクションに入れることもできます__attribute__

int main (void) __attribute__ ((section ("entry")));

そしてldファイルで:

ENTRY(main)
SECTIONS
{
    .text :
    {
        *(main)
        *(.text)
    }
}

他にも興味深い がたくさんあり__attributes__ます。詳細については、http: //gcc.gnu.org/onlinedocs/gcc/Function-Attributes.htmlを参照してください。

于 2013-11-08T22:40:43.263 に答える