dポイントプレゼントキャンペーン実施中!

お世話になります

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

A 回答 (4件)

>関数のアドレスを出力した場合、そのアドレスがどの関数を示しているか、


>static関数では判定できないという事でしょうか?

void sub1()
{
------略----
}
static sub2()
{
------略----
}
の場合

.glb_sub1  <----------ここが違う。static関数はこの命令がでない。
_sub1:
------略----
RTS
_sub2:
------略----
RTS

というアセンブリ言語イメージに落ちます。
sub2は、.glb宣言していないため、外部シンボルにしません。


>ちなみに、mapファイルにstatic関数を出力するリンクオプションが存在するのでしょうか?
コンパイラ・リンカーによってできるものがあるかもしれませんが、
一般的には、できないと思います。



>シンボルが無いという事は、inline関数のようにasmでは展開されるのでしょうか?
上の展開例を参照ください。
    • good
    • 0

CPUやコンパイラによっても事情が変わる話ですが。



static関数のアドレスを知りたい場合の泥臭いテクニック。

そのソースファイルだけ命令コード付きのアセンブラリストとしてコンパイルします。
するとそのリストのアドレスは絶対値でないもの、つまりゼロから始まる相対値として出ているはずです。
で、所望の関数について、もっとも近いところにあるグローバル関数からの相対値を計算し、メモしておきます。
あとは全体をコンパイルしてmapファイルからグローバルシンボルのアドレスを調べれば、相対的に所望のstaticシンボルのアドレスも分かります。

参考まで。
    • good
    • 0

回答になっていなかったです。


グローバルシンボルとして出してしまうと、別ファイルから
呼び出しが可能になるため、グローバルシンボルを出していません。
よって、グローバルシンボルがないため、マップにはでません。

static関数は、ファイル毎で同名の中身の異なった(同じであってもよい)関数を書くことができます。同名の関数が別ファイルにあり、staticでない場合はリンク時2重定義エラーになります。

この回答への補足

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

補足日時:2008/06/19 11:05
    • good
    • 0

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

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!