• ベストアンサー

関数の容量を知るには?

MAPファイルで調べるのではなく、プログラム中からある関数の大きさ(コンパイル後のバイナリのバイト数)を調べる方法は無いでしょうか? 例えば、 void abc(void) { printf("dummy\n"); } というabc関数があったとします。 この関数のコンパイル後のバイナリのバイト数を、 int i; i = sizeof( abc ); みたいな形で調べられないでしょうか? 宜しくお願いします。

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

  • ベストアンサー
  • titokani
  • ベストアンサー率19% (341/1726)
回答No.3

unix系でWindowsのDLLに相当するのはshared objectと呼ばれるものらしいです。 詳しくはないのですが、Windowsと同様に動的なロードもできたと思います。 メモリ上に読み込まれたコードを読み込んで転送するアプローチは無理でしょう。そもそもコード領域を読みに行った時点でアクセス違反です。 それに、Cのコードはネイティブですから、メモリに読み込んだら、別のアドレスに移動することはできません。なので、仮にクライアント側に転送することができたとしても、動かないでしょう。 shared objectについて調べてみてはいかかがでしょうか。 ただ、心配があります。unix系は基本的にバイナリでの互換性がありません。 フリーウェア等がソースコードで配布されているのはこのためです。 もし、クライアントの環境が固定なのであれば、バイナリでの配布も可能だと思いますが、不定なのであれば、バイナリでの配布は使えません。 その点は大丈夫でしょうか?

gigamac
質問者

お礼

下記しましたが、同じスペックのパソコンとVine linuxでバージョンは同じです。 「shared object」ですね。参考になります。ありがとうございます。 現在ですが、自力でもうちょいっていう所まできています。JavaでいうTO(Transfer Object)に扱いが同じようなのですが、がんばってみます。 何にしましても、アドバイスありがとうございます。

その他の回答 (2)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

同じ環境どうしであれば、共有ライブラリを転送すればよいと思います。 そうでないなら、必要なだけの機能を備えたインタープリタでも実装したほうがよいでしょう。あるいは既存のインタープリタを呼び出してもよいと思います。

gigamac
質問者

お礼

環境は、同じスペックのパソコンで、OSもVine Linuxでバージョンも同じです。 なるほど、、共有ライブラリを転送ですね。参考になります。 ありがとうございました。

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.1

環境を問わない、確実な方法はありません。 void func1() { } void func2() { } とあって、 (unsigned long)func2-(unsigned long)func1 とやる方法もあるけれど、func1とfunc2がこの順番で出力される保証はないし、func1とfunc2の間に隙間があることもあるし。 いったいなんのために調べたいのでしょうか? プロファイルみたいなものを散りたいのなら、mapファイルでも十分だと思うのですが。

gigamac
質問者

補足

関数のバイナリをSOCKET通信にてストリーム転送したりハードディスクへ保存したかったのです。アドレスは動的に分かりますが、転送や書き出しの際に必要な情報としてバイト数を求めたかったのです。 Javaだとオブジェクトをバイナリ化してハードディスクやSOCKET通信できるのですが、Cの場合、どうやったら実現できるか悩んでいました。恐らくWindowsで言えばDLLに相当する処理ではと思っているのですが、そのコア部分の仕様(クライアント様ご要望)を模索している最中でした。 ちなみに、環境はLinuxでコンパイラはgccです。

関連するQ&A