名 前
etext, edata, end − プ ロ グ ラ ム セ グ メ ン ト の 終 わ り
書 式
extern
etext;
extern edata;
extern end;
説 明
こ れ ら の シ ン ボ ル の ア ド レ ス は 各 種 の プ ロ グ ラ ム セ グ メ ン ト の 終 わ り を 示 す 。
etext テ キ ス ト セ グ メ ン ト |
(プ ロ グ ラ ム の コ ー ド ) の 末 尾 の 次 の ア ド レ ス 。 | |
edata 初 期 化 さ れ た デ ー タ の |
セ グ メ ン ト の 末 尾 の 次 の ア ド レ ス 。
end 初 期 化 さ れ て い な い デ ー タ の セ グ メ ン ト |
(BSS セ グ メ ン ト と も 言 わ れ |
る ) の 末 尾 の 次 の ア ド レ ス 。
準 拠
こ れ ら の シ ン ボ ル は 長 年 ほ と ん ど の UNIX シ ス テ ム で 提 供 さ れ て い る が 、 標 準 化 さ れ て は い な い 。 注 意 し て 使 う こ と 。
注 意
プ ロ グ ラ ム で は こ れ ら の シ ン ボ ル は 明 示 的 に 宣 言 し な け れ ば な ら な い 。 こ れ ら は ど の ヘ ッ ダ ー フ ァ イ ル で も 定 義 さ れ て い な い 。 い く つ か の シ ス テ ム で は 、 こ れ ら の シ ン ボ ル の 名 前 は 前 に ア ン ダ ー ス コ ア が 付 い て い て 、 _etext, _edata, _end と な っ て い る 。 Linux で コ ン パ イ ル さ れ た プ ロ グ ラ ム で は 、 こ れ ら の シ ン ボ ル で も 定 義 さ れ る 。 プ ロ グ ラ ム の 実 行 開 始 時 に 、 プ ロ グ ラ ム ブ レ ー ク は &end の 近 く の ど こ か (お そ ら く 次 の ペ ー ジ の 先 頭 ) に な る 。 し か し な が ら 、 brk(2) や malloc(3) で メ モ リ ー が 割 り 当 て ら れ る に 連 れ て 、 プ ロ グ ラ ム ブ レ ー ク は 変 化 し て い く 。 引 き 数 に 0 を 指 定 し て sbrk(2) を 呼 び 出 す こ と で 、 プ ロ グ ラ ム ブ レ ー ク の 現 在 値 を 知 る こ と が で き る 。
例
下 記 の プ ロ グ ラ ム を 実 行 す る と 、 次 の よ う な 出 力 が 得 ら れ る 。
$
./a.out
First address past:
program text (etext) 0x8048568
initialized data (edata) 0x804a01c
uninitialized data (end) 0x804a024 プ ロ
グ ラ ム の ソ ー
ス
#include <stdio.h>
#include <stdlib.h>
extern char
etext, edata, end; /* The symbols must have some type,
or "gcc −Wall" complains */
int
main(int argc, char *argv[])
{
printf("First address past:\n");
printf(" program text (etext) %10p\n",
&etext);
printf(" initialized data (edata) %10p\n",
&edata);
printf(" uninitialized data (end) %10p\n",
&end);
exit(EXIT_SUCCESS); }
関 連 項 目
objdump(1), readelf(1), sbrk(2), elf(5)
こ の 文 書 に つ い て
こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。