C言語の関数はどの領域に確保されますか? – プログラミング – Home

C言語の関数はどの領域に確保されますか...
 
通知
すべてクリア

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


さきね
 さきね
(@さきね)
ゲスト
結合: 20年前
投稿: 1
Topic starter  

はじめまして。

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

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

よろしくお願いします。


引用解決済
トピックタグ
wood
 wood
(@wood)
ゲスト
結合: 23年前
投稿: 895
 

もう少し具体的質問の方がレスつき易いと思いますよ

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

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

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

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


返信引用
アイススケーター
 アイススケーター
(@アイススケーター)
ゲスト
結合: 22年前
投稿: 280
 

もし、VisualStudio等を利用しているのであれば、デバッグモードでコンパイル後、
混合モードで表示する機能がありますので、まず見てみたらどうでしょう。


返信引用
名無し
 名無し
(@名無し)
ゲスト
結合: 20年前
投稿: 15
 

_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

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

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


返信引用
reshia
 reshia
(@reshia)
ゲスト
結合: 20年前
投稿: 117
 

グローバル変数はどこ?ローカル変数は?関数呼び出しの時の引数は?返り値は?
クラスのインスタンスは?プライベートなメンバは?パブリックなメンバは?
っていうかメインはどこから?

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

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


返信引用
とおり
 とおり
(@とおり)
ゲスト
結合: 21年前
投稿: 43
 

全く関係ないですが、中田育男先生、つい先日退官されました。
最終講義聞きに行きたかったなぁ…


返信引用
とおり
 とおり
(@とおり)
ゲスト
結合: 21年前
投稿: 43
 

ついでに…

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

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

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

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


返信引用
wood
 wood
(@wood)
ゲスト
結合: 23年前
投稿: 895
 

>exeにしろshared library(dll)にしろ、大抵のOSのloaderはload moduleをそのまま
>の形でメモリ上にloadすると思いますよ。

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

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

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


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

> exeにしろshared library(dll)にしろ、大抵のOSのloaderはload moduleをそのまま
> の形でメモリ上にloadすると思いますよ。

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

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました