C言語の関数はどの領域に確保されますか?

[戻る]
さきね 2005/03/15(火) 23:18:10
はじめまして。

C言語のソースをコンパイルして、実行すると、関数などの領域というのはどこに
確保されるのでしょうか?( .data等のどこでしょうか? )

いろいろと知りたくなり探しているのですが、なかなか見つからなかったので
ここで質問させていただきました。

よろしくお願いします。

wood 2005/03/16(水) 05:40:26
もう少し具体的質問の方がレスつき易いと思いますよ

>実行すると、関数などの領域というのはどこに
メモリ上に読み込まれた場合の話?

>( .data等のどこでしょうか? )
って書いてあるから、もしかして「EXE ファイル」内部の話?
例)100バイト目から120バイト目までをAAA()と言う関数を示している
  なんてことを想定してますか?

実行OSは何で説明が欲しいのでしょう?
マシンはintel、AMD、PPC

想像は掻き立てられる質問ですけど、場合によってはアセンブラを勉強したほうが
良いのでは?

アイススケーター 2005/03/16(水) 06:14:47
もし、VisualStudio等を利用しているのであれば、デバッグモードでコンパイル後、
混合モードで表示する機能がありますので、まず見てみたらどうでしょう。

名無し 2005/03/16(水) 11:27:42
_TEXT    SEGMENT PARA USE32 PUBLIC 'CODE'

シャノン 2005/03/16(水) 21:35:14
たぶん .text セクションなのでしょうが、コンパイラが違えば違う場合もありますし、
wood さんがおっしゃるとおり、CPU によっても全く違います。
個々の関数単位となると、インライン展開されると跡形もなくなってしまう場合もあり
ますし、最適化がかかると、元のソースコードとはかけ離れたものが生成される可能性
もあります。

知ってどうするの? とも思います。

reshia 2005/03/16(水) 22:35:19
グローバル変数はどこ?ローカル変数は?関数呼び出しの時の引数は?返り値は?
クラスのインスタンスは?プライベートなメンバは?パブリックなメンバは?
っていうかメインはどこから?

みたいな内容でしょうか?
昔、コンパイラを作ったときに、そんなことを勉強しました。

スモールコンパイラの制作で学ぶプログラムのしくみ
石田 綾 (著), 中田 育男
http://www.amazon.co.jp/exec/obidos/ASIN/4774121770
こんな本でも読めばわかるんじゃないですか?

とおり 2005/03/17(木) 01:57:08
全く関係ないですが、中田育男先生、つい先日退官されました。
最終講義聞きに行きたかったなぁ…

とおり 2005/03/17(木) 02:04:42
ついでに…

>メモリ上に読み込まれた場合の話?

exeにしろshared library(dll)にしろ、大抵のOSのloaderはload moduleをそのまま
の形でメモリ上にloadすると思いますよ。
そして、コードは.textセクションにあるのが通常でしょう。

>知ってどうするの? とも思います。

通常は全くもって不要な知識ですね。
ですが、ちょっと突っ込んだcore解析などでは基本&必須となる知識でもあります。

wood 2005/03/17(木) 02:39:47
>exeにしろshared library(dll)にしろ、大抵のOSのloaderはload moduleをそのまま
>の形でメモリ上にloadすると思いますよ。

昔の話で申し訳ないですが、MS−DOSの時代には、
オーバレイロードと言うものがあって、物理ファイル上のアドレスとメモリ(論理上)
のアドレスと違う場所に読み込まれましたよ

また、特定PCにおいては、リンク時にロードアドレス指定リンクと言うものが行えて
ましたし、リンク構造指定、
メモリモデル指定(コンパクト、スモール、ラージ、ヒュージ)なんてのもあったな〜

確か(.DEF)なんかでもセグメント指定はいまだに出来たと思いますよ
最近はそんなの気にするほど超巨大なもの作る意欲が無いから
意識して調べてませんけど...

シャノン 2005/03/17(木) 10:28:08
> exeにしろshared library(dll)にしろ、大抵のOSのloaderはload moduleをそのまま
> の形でメモリ上にloadすると思いますよ。

ロードした後、メモリ上のイメージをいろいろ書き換えますよ。
そっくりそのままってことはないです。

> そして、コードは.textセクションにあるのが通常でしょう。

PE ファイルの規格で、そのセクション(セグメント?)が .text という名前でなけれ
ばならないということはありません。
それに、スレタイは「C 言語の関数は〜」ですが、Windows 以外のプラットフォームに
おいては、C 言語のソースをコンパイルしたものが、すべて PE フォーマットになるわ
けでもないでしょう。

古いスレッドには追加発言できません。