- ベストアンサー
static関数がmapファイルに載らない理由
お世話になります static関数がmapファイルに載らない理由を教えてください よろしくお願い致します
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>関数のアドレスを出力した場合、そのアドレスがどの関数を示しているか、 >static関数では判定できないという事でしょうか? void sub1() { ------略---- } static sub2() { ------略---- } の場合 .glb _sub1 <----------ここが違う。static関数はこの命令がでない。 _sub1: ------略---- RTS _sub2: ------略---- RTS というアセンブリ言語イメージに落ちます。 sub2は、.glb 宣言していないため、外部シンボルにしません。 >ちなみに、mapファイルにstatic関数を出力するリンクオプションが存在するのでしょうか? コンパイラ・リンカーによってできるものがあるかもしれませんが、 一般的には、できないと思います。 >シンボルが無いという事は、inline関数のようにasmでは展開されるのでしょうか? 上の展開例を参照ください。
その他の回答 (3)
- tokichim
- ベストアンサー率42% (88/205)
CPUやコンパイラによっても事情が変わる話ですが。 static関数のアドレスを知りたい場合の泥臭いテクニック。 そのソースファイルだけ命令コード付きのアセンブラリストとしてコンパイルします。 するとそのリストのアドレスは絶対値でないもの、つまりゼロから始まる相対値として出ているはずです。 で、所望の関数について、もっとも近いところにあるグローバル関数からの相対値を計算し、メモしておきます。 あとは全体をコンパイルしてmapファイルからグローバルシンボルのアドレスを調べれば、相対的に所望のstaticシンボルのアドレスも分かります。 参考まで。
- R32C
- ベストアンサー率39% (115/290)
回答になっていなかったです。 グローバルシンボルとして出してしまうと、別ファイルから 呼び出しが可能になるため、グローバルシンボルを出していません。 よって、グローバルシンボルがないため、マップにはでません。 static関数は、ファイル毎で同名の中身の異なった(同じであってもよい)関数を書くことができます。同名の関数が別ファイルにあり、staticでない場合はリンク時2重定義エラーになります。
- R32C
- ベストアンサー率39% (115/290)
グローバルシンボルとしてstatic関数をだしていないからです。
補足
ありがとうございます 関数のアドレスを出力した場合、そのアドレスがどの関数を示しているか、static関数では判定できないという事でしょうか? ちなみに、mapファイルにstatic関数を出力するリンクオプションが存在するのでしょうか? シンボルが無いという事は、inline関数のようにasmでは展開されるのでしょうか?