2012-03-15 9 views
5

私はツールチェーン(Yagartoとcodesourcery)サイズユーティリティを使用したときに得られる結果で少し混乱します。私はデータセクションで0バイトを使用していることを報告しています。私は、直接私が見るリンク取得されたオブジェクトファイルの一部をサイズツールを通過したときに私のコードは、興味深いことに0arm-none-eabi-sizeは、初期化されたRAMを使用していても.dataセクションが0になるのはなぜですか?

以外の値にスタティックRAM変数を使用して初期化している知っている

$ arm-none-eabi-size.exe rest-server-example.crazy-horse.elf 
    text data  bss  dec  hex filename 
    79364  0 34288 113652 1bbf4 rest-server-example.crazy-horse.elf 

下記参照

text data  bss  dec  hex filename 
    1648  0  20 1668  684 obj_crazy-horse/uip-nd6.o 
    200  12 2652 2864  b30 obj_crazy-horse/uip-packetqueue.o 
    12  0  0  12  c obj_crazy-horse/uip-split.o 
    1816  24  48 1888  760 obj_crazy-horse/usb-core.o 
    284  0  0  284  11c obj_crazy-horse/usb-interrupt.o 
    2064  20  188 2272  8e0 obj_crazy-horse/xmac.o 

なぜ.dataセクションときmはオブジェクトファイルのELFファイルレポート0になります.dataセクションは

例を報告していますそれはゼロ以外の値を報告していますか? FYI

私はAT91SAM7x256マイクロ

編集用組込みソフトウェアに取り組んでいます:私たちははっきりと見ることができるオブジェクトのダンプから :CFLAGSとLDFLAGS

CFLAGS += -O -DRUN_AS_SYSTEM -DROM_RUN -ffunction-sections 

LDFLAGS += -L $(CPU_DIRECTORY) -T $(LINKERSCRIPT) -nostartfiles -Wl,-Map,$(TARGET).map 

編集#2を追加する

.dataセクションにデータが割り当てられていますが、何らかの理由でsizeユーティリティがデータを取得していないことを確認してください。 objdump link

私が探しているのは、自分のRAMの正確な使い方です。自分の変数のうちどれかが最適化されているかどうかを判断しようとしていません。

編集3:サイズのユーティリティは.dataセクションで何かを見ないことを示す 詳しく

$ arm-none-eabi-size.exe -A -t -x rest-server-example.crazy-horse.elf 
rest-server-example.crazy-horse.elf : 
section    size  addr 
.vectrom    0x34 0x100000 
.text    0x10fc8 0x100038 
.rodata   0x149c 0x111000 
.ARM.extab   0x30 0x11249c 
.ARM.exidx   0xe0 0x1124cc 
.data    0x1028 0x200000 
.bss    0x7bec 0x201028 
.stack    0xa08 0x20f5f8 
.ARM.attributes  0x32  0x0 
.comment    0x11  0x0 
.debug_aranges  0xc68  0x0 
.debug_info  0x2b87e  0x0 
.debug_abbrev  0x960b  0x0 
.debug_line  0x9bcb  0x0 
.debug_frame  0x4918  0x0 
.debug_str   0x831d  0x0 
.debug_loc  0x13fad  0x0 
.debug_ranges  0x620  0x0 
Total    0x7c4c5 
+0

マップファイルもチェックして、メモリの.data領域に割り当てられたデータを表示します。 – maguirre

+2

私の最初の推測は、セクションが最適化されていることです。 '--gc-sections'や' --function-sections'でコンパイル/リンクしていますか? –

+0

私は可視性を高めるために元の投稿を編集しましたが、私は--function-sectionsを使用しています。しかし、それを削除しても何も変わらない – maguirre

答えて

2

私の解釈は、リンカスクリプトは、の初期値を含む単一のロード可能なセクションを作成していることだろうデータセクションと、そのデータを初期化されていないデータセクションにコピーするスタートアップコードとを含む。

これは、読み取り専用メモリから実行できる単一の画像ファイルを作成したい場合に必要です。これは、そのコピーを実行するELFローダーがないためです。

通常、入力セクションを2回マッピングするのではなく、セグメントマッピング(出力セクションは>セクション配置コマンドを使用してリンカースクリプトに配置されます)でのみ行われますが、確かに同様に可能です。

使用回数は非常に正確です。テキストサイズは必要なフラッシュスペースの量です.BSSサイズは必要なRAM容量です。初期化されたデータは、Flashの初期データ用に1回、RAM内の変更可能データ用に1回計2回カウントされます。

+0

私はサイモンごめんなさい。自分のデータセクションにサイズ0が表示されている理由を説明する方法を理解しているかどうかはわかりません。 – maguirre

+0

あなたの実行ファイルはELFファイルとして読み込まれるのではなく、生のバイナリイメージに変換され、実行中に読み込み専用になるフラッシュメモリに書き込まれます。したがって、出力セクションのタイプには、初期化/読み取り専用、および初期化/読み書きの2つのタイプがあります。書き込み可能なデータを初期化するには、(.text/.rodataの残りの部分とともに)初期化された領域に初期値を格納し、起動後に書き込み可能な領域に最初の値をコピーします。これは自動的にあなたのためにリンクされているスタートアップコードによって行われます。 –

+0

私はあなたの答えを理解すると思います。しかし、私はそれが私の問題の答えだとは思わない。元のカウントロトを元のプロジェクトに戻すために使用しました。ある時点で.dataセクションが0ではなかったからです。 – maguirre

1

あなたの.dataセクションにはCODE属性が設定されており、これは "arm-none-eabi-size"と混同します。 .dataセクションのサイズは、データサイズではなく合計テキストサイズに正しく追加されません。

私はフラッシュに保存されているが、RAMから実行する必要のある高速割り込みハンドラやフラッシュ書き換えのように、実行時にRAMにコピーされるコードがあると思います。これは、データセグメントのCODE属性を設定し、 "サイズ"はすべての.dataがテキストであると考えます。

+0

あなたはそれがどういう場合にどのように伝えることができますか? – maguirre

+0

objdumpから: セクション: 5。データ00001028 00200000 001125ac 00020000 2 \ * \ * 3 CONTENTS、ALLOC、LOAD、** CODE ** –

関連する問題