忍者ブログ
趣味+メモ用のブログです。 GNU/Linux関連、OSS関連情報、調査事項になるでしょうが、何を書くか分かりません。
[77] [76] [75] [74] [73] [72] [71] [70] [69] [68] [67]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

gcc(binutil)でメソッドごとのROMサイズ(TEXT)の確認方法


<大まかな手順>
1)リンク後のオブジェクトを nm出力
2)アドレス順にソート (sort)
3)関数前後のアドレスを引き算して、各メソッドの容量を確認
 → Excelの hex2dec (アドオン関数)を使用すると便利

<コマンド>
$ nm typevalue | sort | sed -e 's@  *@ @g' | sed -e 's@ @,@g' > nm.txt
※ 最後のsedパイプは、Excel用のスペース→カンマ変換です。
※ .txtにしたのは、Excelで読み込み時に、カラムの型指定を強制させるため。
※ 2013/11/24 -Cオプションを削除(デマングル後の関数名内にカンマが入るため)
<出力例>
$ cat nm.txt
,U,_Unwind_Resume@@GCC_3.0
,U,__gxx_personality_v0@@CXXABI_1.3
,U,__libc_start_main@@GLIBC_2.0
,U,printf@@GLIBC_2.0
,w,_ITM_deregisterTMCloneTable
,w,_ITM_registerTMCloneTable
,w,_Jv_RegisterClasses
,w,__gmon_start__
08048424,T,_init
080484b0,T,_start
080484e0,t,deregister_tm_clones
08048510,t,register_tm_clones
08048550,t,__do_global_dtors_aux
08048570,t,frame_dummy
0804859c,T,main
08048616,W,_ZN13TypeValueBaseC1Ev
08048616,W,_ZN13TypeValueBaseC2Ev
0804861c,W,_ZN9TypeValueIiEC1Ei
0804861c,W,_ZN9TypeValueIiEC2Ei
08048638,W,_ZN9TypeValueIsEC1Es
08048638,W,_ZN9TypeValueIsEC2Es
0804865c,W,_ZN9TypeValueIcEC1Ec
0804865c,W,_ZN9TypeValueIcEC2Ec
0804867e,W,_Z14printTypeValueIiEvP13TypeValueBase
080486bc,W,_Z14printTypeValueIsEvP13TypeValueBase
080486fc,W,_Z14printTypeValueIcEvP13TypeValueBase
08048740,W,_ZN13TypeValueBase8getValueIiEET_v
08048752,W,_ZN9TypeValueIiE8getValueEv
0804875c,W,_ZN13TypeValueBase8getValueIsEET_v
0804876e,W,_ZN9TypeValueIsE8getValueEv
0804877a,W,_ZN13TypeValueBase8getValueIcEET_v
0804878a,W,_ZN9TypeValueIcE8getValueEv
080487a0,T,__libc_csu_fini
080487b0,T,__libc_csu_init
0804880a,T,__i686.get_pc_thunk.bx
08048810,T,_fini
08048828,R,_fp_hw
0804882c,R,_IO_stdin_used
08048af0,r,__FRAME_END__
08049b00,t,__frame_dummy_init_array_entry
08049b00,t,__init_array_start
08049b04,t,__do_global_dtors_aux_fini_array_entry
08049b04,t,__init_array_end
08049b08,d,__JCR_END__
08049b08,d,__JCR_LIST__
08049b0c,d,_DYNAMIC
08049c18,d,_GLOBAL_OFFSET_TABLE_
08049c38,D,__data_start
08049c38,W,data_start
08049c3c,D,__dso_handle
08049c40,A,__bss_start
08049c40,A,_edata
08049c40,D,__TMC_END__
08049c40,b,completed.5730
08049c44,A,_end

<nmコマンドのシンボルについて> GNU nmマニュアルより(http://www.nxmnpg.com/ja/1/nm)
GNU nm はオブジェクトファイル objfile... からシンボルをリストします。 
引数でオブジェクトファイルが与えられないと、 nm は a.out を対象とします。
各シンボルに対し、nm は次のものを表示します:
»	 シンボルの値を、オプションで選択された基数 (後述) 
   またはデフォルトの 16 進数で表示します。
»	 シンボルの型。 少なくとも次の型が使用されます。
    他の型についてはオブジェクトファイルフォーマットに依存します。 
   小文字の場合シンボルはローカルであり、大文字の場合シンボルは
   グローバル (外部的です)。
A	 シンボルの値は絶対的であり、さらなるリンクによって変更されません。
B	 シンボルは未初期化データセクション (BSS のこと) にあります。
C	 シンボルはコモンです。 コモンシンボルは未初期化データです。
   リンク時には、複数のコモンシンボルが同一の名前として見え得ます。
   シンボルがどこかで定義されている場合、 コモンシンボルは未定義の参照として扱われます。
D	 シンボルは初期化済データセクションにあります。
G	 シンボルは、小さいオブジェクト用の、初期化済データセクションにあります。
   オブジェクトフォーマットによっては、 小さいデータオブジェクトへのより
   効率の良いアクセスを提供しているものがあります。
   小さいオブジェクトとは、 例えば、大きなグローバル配列に対する、
   グローバル int 変数のことを指します。
I	 シンボルは、他のシンボルに対する間接参照です。 
   これは、a.out オブジェクトファイルフォーマットに対する GNU 拡張ですが、
   ほとんど使われません。
N	 シンボルはデバッグシンボルです。
R	 シンボルは読み取り専用セクションにあります。
S	 シンボルは、小さいオブジェクト用の、未初期化データセクションにあります。
T	 シンボルは、テキスト (コード) セクションにあります。
U	 シンボルは未定義です。
V	 シンボルは弱いオブジェクトです。 
   弱く定義されたシンボルが通常定義されたシンボルとリンクされるとき、
   エラー無しで通常定義されたシンボルが使用されます。
   弱い未定義なシンボルがリンクされそのシンボルが未定義なとき、
   弱いシンボルの値はエラー無しに 0 になります。
W	 シンボルは弱いオブジェクトですが、 弱いオブジェクトであるとは特に指定されていませんでした。
   弱く定義されたシンボルが通常定義されたシンボルとリンクされるとき、
   エラー無しで通常定義されたシンボルが使用されます。
   弱い未定義なシンボルがリンクされそのシンボルが未定義なとき、
   弱いシンボルの値はエラー無しに 0 になります。
-	 シンボルは、a.out オブジェクトファイルの stabs シンボルです。
   この場合、次に表示される値は、 stabs の他のフィールド、stabs の 
   desc フィールド、stab タイプです。 stabs シンボルはデバッグ情報を
   保持するために使用されます。
?	 シンボルの型は未知であり、オブジェクトファイルフォーマット固有です。
»	 シンボル名。
PR


忍者ブログ [PR]
カレンダー
10 2024/11 12
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
フリーエリア
最新コメント
最新トラックバック
プロフィール
HN:
一乗寺 又兵衛
性別:
男性
職業:
コンパイル
趣味:
コンパイル
バーコード
ブログ内検索