• ベストアンサー

static関数がmapファイルに載らない理由

お世話になります static関数がmapファイルに載らない理由を教えてください よろしくお願い致します

質問者が選んだベストアンサー

  • ベストアンサー
  • R32C
  • ベストアンサー率39% (115/290)
回答No.4

>関数のアドレスを出力した場合、そのアドレスがどの関数を示しているか、 >static関数では判定できないという事でしょうか? void sub1() { ------略---- } static sub2() { ------略---- } の場合 .glb _sub1  <----------ここが違う。static関数はこの命令がでない。 _sub1: ------略---- RTS _sub2: ------略---- RTS というアセンブリ言語イメージに落ちます。 sub2は、.glb 宣言していないため、外部シンボルにしません。 >ちなみに、mapファイルにstatic関数を出力するリンクオプションが存在するのでしょうか? コンパイラ・リンカーによってできるものがあるかもしれませんが、 一般的には、できないと思います。 >シンボルが無いという事は、inline関数のようにasmでは展開されるのでしょうか? 上の展開例を参照ください。

その他の回答 (3)

  • tokichim
  • ベストアンサー率42% (88/205)
回答No.3

CPUやコンパイラによっても事情が変わる話ですが。 static関数のアドレスを知りたい場合の泥臭いテクニック。 そのソースファイルだけ命令コード付きのアセンブラリストとしてコンパイルします。 するとそのリストのアドレスは絶対値でないもの、つまりゼロから始まる相対値として出ているはずです。 で、所望の関数について、もっとも近いところにあるグローバル関数からの相対値を計算し、メモしておきます。 あとは全体をコンパイルしてmapファイルからグローバルシンボルのアドレスを調べれば、相対的に所望のstaticシンボルのアドレスも分かります。 参考まで。

  • R32C
  • ベストアンサー率39% (115/290)
回答No.2

回答になっていなかったです。 グローバルシンボルとして出してしまうと、別ファイルから 呼び出しが可能になるため、グローバルシンボルを出していません。 よって、グローバルシンボルがないため、マップにはでません。 static関数は、ファイル毎で同名の中身の異なった(同じであってもよい)関数を書くことができます。同名の関数が別ファイルにあり、staticでない場合はリンク時2重定義エラーになります。

giko_neko
質問者

補足

ありがとうございます 関数のアドレスを出力した場合、そのアドレスがどの関数を示しているか、static関数では判定できないという事でしょうか? ちなみに、mapファイルにstatic関数を出力するリンクオプションが存在するのでしょうか? シンボルが無いという事は、inline関数のようにasmでは展開されるのでしょうか?

  • R32C
  • ベストアンサー率39% (115/290)
回答No.1

グローバルシンボルとしてstatic関数をだしていないからです。

関連するQ&A