• ベストアンサー

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

  • 関数内、ファイルのstatic変数

    関数内で、static変数を宣言した場合に、その値は保持されると 思いますが、その関数の外からポインタで見る場合にその値は 保証されるのでしょうか? (必ず同じメモリ上に配置されるのでしょうか?) また、関数とファイル内static変数においてスコープ以外に 取り扱いが変わったりするのでしょうか? (配置されるメモリ空間等) よろしくお願い致します。

  • 『関数内static変数』の別名って??

    1、『関数内static変数』の別名で一言の呼び方ってありますか?? 2、『static変数』と呼ぶときは通常、ファイル内で有効な変数(この場合だとファイルローカルな変数??)と考えてよいのですね? おねがいしますm(_ _)m

  • static な c 関数の unit-test どこに書くかの?

    こんにちは unittest コードはソースと別ファイルで管理するつもりですが、staticなc関数の場合、同ファイル内しかアクセスできないため、うまくできない。皆さんどのようにしているのでしょうか? いくつかの方法が考えていますが完璧なものはない 1、#include xxx.c   乱暴だが、うまくいくはず。っと思いきやstaticでない関数がいたりして。。。 2、ソースと一緒にunittestを書く   まぁ、最後の手段だけどな 3、staticを取り除く   いやですね、同名関数いるかもしれないし 4、Interfaceをつくる   そこまで大げさとはな、短い関数だし ちなみに c++の場合 friend を活用すればよいが。

  • static 関数のメモリ使用量

    会社で過去のプログラムを参考に新規開発を行っているものですが、 旧プログラムは関数宣言でstaticを使用しており、関数のカプセル化をしている。 旧プログラムをみならい、staticで関数を宣言したのですがレビュー時にstaticで関数を宣言した場合、 『メモリーを多く使用するのでは?』と質問されたのですが回答が見つかりません。 詳しい方教えていただけますか? プログラムはファイル分割されており、同一関数名は存在している。 コンパイラーはgccです。

  • staticな関数をテストする方法について

    C言語やC++言語でstaticなグローバル関数を作成することがあります。 これをテストコードから呼び出せるようにするにはどうしたらいいでしょうか。 元のソースには、できるだけ変更を加えたくありません 今はテスト対象のソースファイルを、 テストが書かれているソースファイルでincludeすることで呼び出せるようにしていますが 他にいい方法はないでしょうか

  • 「static宣言されているメンバ関数」は、「インスタンスメソッド」な

    「static宣言されているメンバ関数」は、「インスタンスメソッド」なのでしょうか? それとも、「クラスメソッド」なのでしょうか? 先日、下記内容で質問して、その時は分かったつもりだったのですが、 やっぱり分かってなかったようなので、教えてください。 ▽「クラス関数」「メンバ関数」「メソッド」の違いを教えてください。   http://okwave.jp/qa/q5858806.html 例) ▽前提 ・Aクラスのインスタンスa ・static宣言されたpublicメソッド「static_public_method」 ・static宣言されていないpublicメソッド「public_method」 ▽メンバ関数呼び出し ・$a->static_public_method() ・A::static_public_method() ・A::public_method() このとき、「$a->static_public_method()」は、インスタンス経由でアクセスすることになるので、 「インスタンスメソッド」になるのでしょうか。それとも、static(静的)宣言しているので、「クラスメソッド」になるのでしょうか? また、「A::static_public_method()」や、「A::public_method()」は、どちらになるのでしょうか? ※現在、頭の中がこんがらがっているのは、下記3点です。どれかひとつでも構わないので、分かりやすい考え方等あれば、ぜひ教えてください。 ・「static宣言したメンバ関数」は、「インスタンスメソッド」? 「クラスメソッド」? ・「スタティック」宣言してるのに、メンバ関数へ、「->(アロー演算子)」(オブジェクト経由)でアクセスできる理由 ・「A::static_public_method()」と「A::public_method()」の違い

    • ベストアンサー
    • PHP
  • 関数の前にある staticやinlineの意味?

    関数の先頭に static inline なし の3パターンがありますが、そのうちなしは普通の関数、inlineは、マクロのように展開?する関数と理解していますが、関数にstaticをつけるのは何の効果を狙っているものでしょうか? inlineは呼び出しを減らす?効果だと思いますが、C言語は結構奥が深いです。

  • waveout関数で、ソースファイルを再生する方法を教えてください。

    いつもお世話になります。 波形データを作成して、 それをwaveout関数で再生することはできたのですが、 ソースファイルを再生することができません。 参考HPには、ソースファイルからの再生については、 書かれていませんでした。 static LPBYTE lpBuf; static HWAVEOUT hWOut; static WAVEHDR wh; static WAVEFORMATEX wf; の、いずれかからソースファイルを指定するとは思うのですが、いまいちよくわかりません。 どこで、ソースファイルを指定すればよいのか、 教えてください。よろしくお願いします。

  • Java main関数内でStatic変数使えない

    JavaのStatic変数について質問です。 Main関数の中でStaticな変数を定義しようとしたところ、 final修飾子しか使えませんというエラー文言が出ます。 Main関数内でわざわざStatic変数を使用する必要はないのですが、 出来ないと言われると何故だろうと思ってしまいます。 どなたかご説明いただけないでしょうか? -------------------------------------------------------------------- class Test { public static void main(String[] args) { // 宣言時Staticは使えなく、finalでしか定義できないとエラーが出る Static int test_val = 10; // 表示 System.out.println(test_val); } }

    • ベストアンサー
    • Java
  • 非staticフィールドを参照できない理由とは

     java勉強中です、宜しくお願いします。  下のようなプログラムを書き「Test1」をコメントアウトしたら、 「非staticフィールドをstatic参照できません。」というエラーが 出ました。  「Test1 t」をグローバル変数で定義したのですが、やはりを 「static」からは見れないということでしょうか。  「main」は特別な関数というのは分るのですが、staticフィールドとか クラスオブジェクトしか、main()からは覗けないという設計思想(?) とかはどのようなものなのでしょうか。  逆に覗けるのが可能ならばどのような不都合が生じるのでしょうか。  何かしら非常に不便を感じて使い勝手が悪いという気がして仕方ない のですが、特別にこうしなけらばならないとか、今までの他の言語であ った不具合(ex 隠蔽機能)を更に強化したためとかと言う理由があるの でしょうか。  ========================================================== public class Test1 { Test1 t; void calc() { int a = 2; int b = 3; System.out.println(a+b); } public static void main(String args[]) { /*Test1*/ t = new Test1(); t.calc(); } }

    • ベストアンサー
    • Java