20

これは、Linux の man ページからのコードです。

#include <stdio.h>
#include <stdlib.h>

extern char etext, edata, end;

int main() {
    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);
}

以下のプログラムを実行すると、次のような出力が生成されます。

$ ./a.out
First address past:
    program text (etext)       0x8048568
    initialized data (edata)   0x804a01c
    uninitialized data (end)   0x804a024

はどこetextedata end定義されていますか? これらの記号にどのように値が割り当てられますか? それはリンカーか何かによるものですか?

4

4 に答える 4

12

Mac OS Xでは、上記のコードが機能しない場合があることに注意してください。代わりにあなたは持つことができます:

#include <stdio.h>
#include <stdlib.h>
#include <mach-o/getsect.h>

int main(int argc, char *argv[])
{
    printf("    program text (etext)      %10p\n", (void*)get_etext());
    printf("    initialized data (edata)  %10p\n", (void*)get_edata());
    printf("    uninitialized data (end)  %10p\n", (void*)get_end());

    exit(EXIT_SUCCESS);
}
于 2012-02-08T02:38:12.530 に答える
8

これらのシンボルは、リンカー スクリプト ファイル( archive.org のデッド リンク コピー) で定義されています。

于 2009-11-19T19:41:49.620 に答える
3

これらの記号は、さまざまなプログラム セグメントの先頭に対応しています。それらはリンカーによって設定されます。

于 2009-11-19T19:40:08.157 に答える