趣味+メモ用のブログです。
GNU/Linux関連、OSS関連情報、調査事項になるでしょうが、何を書くか分かりません。
× [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 |
カレンダー
カテゴリー
フリーエリア
最新コメント
最新記事
(05/02)
(01/25)
(01/15)
(12/04)
(12/01)
最新トラックバック
ブログ内検索
最古記事
(02/21)
(07/12)
(07/12)
(07/18)
(07/20) |