1

列のアドレス、権限、オフセット、デバイスなどについての理論を理解しました...しかし、各セグメントとプログラム自体との関係はわかりませんでした。たとえば、次のマップを考えてみましょう。

08048000-08049000 r-xp 00000000 08:01 132351     /home/myuser/myprogram
08049000-0804a000 r--p 00000000 08:01 132351     /home/myuser/myprogram
0804a000-0804b000 rw-p 00001000 08:01 132351     /home/myuser/myprogram
0804b000-0804e000 rw-p 00000000 00:00 0
b751f000-b7520000 rw-p 00000000 00:00 0
..... more mapping starting with libc mapping

プログラムの場合:

int global_noini;       /* non-array non-initialized */
int global_ini=666;     /* non-array initialized */


int vec_global_noini[4000]; /* array non-initialized */

/* array_initialized */
int vec_global_ini[]={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};


int main(int argc, char **argv) {
    int local;              /* non-array local variable */
    int vec_local[2500];    /* array local variable */

    /* This function prints the map above */
    show_map();

    return 0;
}

私が知る必要があるのは、どのセグメントにどの変数があり、その理由です。

これまでのところ、 x許可 (実行)があるため、コード自体は最初のセグメントにあると考えています (間違っていたら訂正してください)。しかし、初期化されていない変数、初期化された変数、グローバル変数、およびローカル変数についてはどうでしょうか? それらはどのセグメントに属し、その理由は?

4

1 に答える 1

2

ローカル変数はどこにもありません。まだ。関数フレームがアクティブになると、それらはスタックに置かれます。

const データは確かに "r" としてフラグが立てられていますが、"w" や "x" ではありません。

初期化されたデータは、「x」ではなく「rw」としてフラグが立てられます。初期化されていないデータもおそらく存在します。実際、.data (初期化) と .bss (初期化されていない) は同じですが、.bss は実行可能イメージのスペースを占有しない (ローダーによってゼロに初期化される) ことを除きます。 )。

于 2014-07-08T03:49:14.817 に答える