【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?

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

宜しくお願いします。

A 回答 (3件)

unix系でWindowsのDLLに相当するのはshared objectと呼ばれるものらしいです。


詳しくはないのですが、Windowsと同様に動的なロードもできたと思います。

メモリ上に読み込まれたコードを読み込んで転送するアプローチは無理でしょう。そもそもコード領域を読みに行った時点でアクセス違反です。
それに、Cのコードはネイティブですから、メモリに読み込んだら、別のアドレスに移動することはできません。なので、仮にクライアント側に転送することができたとしても、動かないでしょう。

shared objectについて調べてみてはいかかがでしょうか。
ただ、心配があります。unix系は基本的にバイナリでの互換性がありません。
フリーウェア等がソースコードで配布されているのはこのためです。
もし、クライアントの環境が固定なのであれば、バイナリでの配布も可能だと思いますが、不定なのであれば、バイナリでの配布は使えません。

その点は大丈夫でしょうか?
    • good
    • 0
この回答へのお礼

下記しましたが、同じスペックのパソコンとVine linuxでバージョンは同じです。
「shared object」ですね。参考になります。ありがとうございます。

現在ですが、自力でもうちょいっていう所まできています。JavaでいうTO(Transfer Object)に扱いが同じようなのですが、がんばってみます。
何にしましても、アドバイスありがとうございます。

お礼日時:2009/05/15 19:45

同じ環境どうしであれば、共有ライブラリを転送すればよいと思います。


そうでないなら、必要なだけの機能を備えたインタープリタでも実装したほうがよいでしょう。あるいは既存のインタープリタを呼び出してもよいと思います。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/05/15 19:41

環境を問わない、確実な方法はありません。


void func1()
{
}
void func2()
{
}
とあって、
(unsigned long)func2-(unsigned long)func1
とやる方法もあるけれど、func1とfunc2がこの順番で出力される保証はないし、func1とfunc2の間に隙間があることもあるし。

いったいなんのために調べたいのでしょうか?
プロファイルみたいなものを散りたいのなら、mapファイルでも十分だと思うのですが。

この回答への補足

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

補足日時:2009/05/15 16:52
    • good
    • 0

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