0
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_ram_entry)
SECTIONS
{
    . = 0xA0008000;

    . = ALIGN(4);
    .text : { *(.text) }

    . = ALIGN(4);
    .rodata : { *(.rodata) }

    . = ALIGN(4);
    .data : { *(.data) }

    . = ALIGN(4);
    .got : { *(.got) }

    . = ALIGN(4);
    .bss : { *(.bss) }
}

output_format、output_arch、entry ...を取得します。これは、出力がelf32-littlearmなどになることを意味している可能性があります。

しかし、セクションの部分は私が得られないものです。

これ '。='が始まりです。

と '。= ALIGN(4)'および.text:{*(。text)}...。

誰かがこのT_Tで私を助けることができます

読んでくれてありがとう。

4

2 に答える 2

1
    . = 0xA0008000;

私は思いますが、100%確信はありませんが、アームがバイナリの実行を開始する場所です

    . = ALIGN(4);

次の命令を整列させる方法を定義します。

.text、、、、および。.data_ プログラムのセクションです。テキストは、初期化されたデータセクションの命令、データ、およびrodata用であり、初期化されていないデータセクションの場合はbssです。取得したのはグローバルオフセットテーブルです。.rodata.gotbss

    .text : { *(.text) }

これにより、すべての命令がコピーされます。同様のコマンドは、データおよびグローバルオフセットテーブル用です。

于 2012-10-30T13:22:54.190 に答える
1

実際、このリンカー記述言語は、最後にチェックしたldのドキュメントで定義されています。見た目ほど悪くはありません。基本的に、「。」演算子は「現在位置ポインタ」を指します。だから、ライン

. = 0xA0008000 

ロケーションポインタをその値に移動すると言います。次のエントリ.textは、基本的に、すべてのテキストオブジェクトをロケーションポインタ(4バイト(32ビット)の配置になるように調整されている)から始まる最終的なELFファイルの.textセクションに配置することを示しています。 0xA0008000はすでに32ビットにアラインされているため、ALIGNの最初の使用はおそらく冗長です。

次のセクションでは、リンカーに、すべての.rodata、.data、.got、および.bssセクションのコレクションを、32ビットで整列されたアドレスから順番にELFバイナリの最後のそれぞれのセクションに出力するように指示します。

したがって、リンカが生成する最終的なELFバイナリには、これらの5つのセクションがそれぞれ順番に含まれます。readelfユーティリティを使用して、その最終的なELFバイナリの構造を確認できます。これは非常に便利で、これらすべてを理解するのに役立ちます。通常、readelfのクロスバージョン、arm-linux-gnueabi-readelfのようなもの、または使用しているコンパイラ/リンカーを生成するために使用されたプレフィックスがあります。readelf -Sから始めて、ELFファイルに含まれるセクションの要約を取得します。次に、そこから探索できます。幸せな読書!

于 2012-10-30T20:42:11.723 に答える