はじめまして。
C言語のソースをコンパイルして、実行すると、関数などの領域というのはどこに
確保されるのでしょうか?( .data等のどこでしょうか? )
いろいろと知りたくなり探しているのですが、なかなか見つからなかったので
ここで質問させていただきました。
よろしくお願いします。
もう少し具体的質問の方がレスつき易いと思いますよ
>実行すると、関数などの領域というのはどこに
メモリ上に読み込まれた場合の話?
>( .data等のどこでしょうか? )
って書いてあるから、もしかして「EXE ファイル」内部の話?
例)100バイト目から120バイト目までをAAA()と言う関数を示している
なんてことを想定してますか?
実行OSは何で説明が欲しいのでしょう?
マシンはintel、AMD、PPC
想像は掻き立てられる質問ですけど、場合によってはアセンブラを勉強したほうが
良いのでは?
もし、VisualStudio等を利用しているのであれば、デバッグモードでコンパイル後、
混合モードで表示する機能がありますので、まず見てみたらどうでしょう。
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
たぶん .text セクションなのでしょうが、コンパイラが違えば違う場合もありますし、
wood さんがおっしゃるとおり、CPU によっても全く違います。
個々の関数単位となると、インライン展開されると跡形もなくなってしまう場合もあり
ますし、最適化がかかると、元のソースコードとはかけ離れたものが生成される可能性
もあります。
知ってどうするの? とも思います。
グローバル変数はどこ?ローカル変数は?関数呼び出しの時の引数は?返り値は?
クラスのインスタンスは?プライベートなメンバは?パブリックなメンバは?
っていうかメインはどこから?
みたいな内容でしょうか?
昔、コンパイラを作ったときに、そんなことを勉強しました。
スモールコンパイラの制作で学ぶプログラムのしくみ
石田 綾 (著), 中田 育男
http://www.amazon.co.jp/exec/obidos/ASIN/4774121770
こんな本でも読めばわかるんじゃないですか?
全く関係ないですが、中田育男先生、つい先日退官されました。
最終講義聞きに行きたかったなぁ…
ついでに…
>メモリ上に読み込まれた場合の話?
exeにしろshared library(dll)にしろ、大抵のOSのloaderはload moduleをそのまま
の形でメモリ上にloadすると思いますよ。
そして、コードは.textセクションにあるのが通常でしょう。
>知ってどうするの? とも思います。
通常は全くもって不要な知識ですね。
ですが、ちょっと突っ込んだcore解析などでは基本&必須となる知識でもあります。
>exeにしろshared library(dll)にしろ、大抵のOSのloaderはload moduleをそのまま
>の形でメモリ上にloadすると思いますよ。
昔の話で申し訳ないですが、MS-DOSの時代には、
オーバレイロードと言うものがあって、物理ファイル上のアドレスとメモリ(論理上)
のアドレスと違う場所に読み込まれましたよ
また、特定PCにおいては、リンク時にロードアドレス指定リンクと言うものが行えて
ましたし、リンク構造指定、
メモリモデル指定(コンパクト、スモール、ラージ、ヒュージ)なんてのもあったな~
確か(.DEF)なんかでもセグメント指定はいまだに出来たと思いますよ
最近はそんなの気にするほど超巨大なもの作る意欲が無いから
意識して調べてませんけど...
> exeにしろshared library(dll)にしろ、大抵のOSのloaderはload moduleをそのまま
> の形でメモリ上にloadすると思いますよ。
ロードした後、メモリ上のイメージをいろいろ書き換えますよ。
そっくりそのままってことはないです。
> そして、コードは.textセクションにあるのが通常でしょう。
PE ファイルの規格で、そのセクション(セグメント?)が .text という名前でなけれ
ばならないということはありません。
それに、スレタイは「C 言語の関数は~」ですが、Windows 以外のプラットフォームに
おいては、C 言語のソースをコンパイルしたものが、すべて PE フォーマットになるわ
けでもないでしょう。