質問

これは、コードからLinuxマニュアルページ:

#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

があ etext, edata end 。そのシンボルが割り当てます。ですのでリンカーまたは何か?

役に立ちましたか?

解決

はこれらのシンボルはA リンカで定義されていますスクリプトファイルでます。

他のヒント

注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);
}

これらのシンボルは、様々なプログラム・セグメントの始まりに対応します。これらは、リンカによって設定されます。

何GCCは

拡大 kgiannakakis ビットです。

その記号によって定義され、 PROVIDE キーワードのリンカスクリプトを書く https://sourceware.org/binutils/docs-2.25/ld/PROVIDE.html#PROVIDE

デフォルトのスクリプトの発生を構築する場合Binutils、組み込みの ld 実行ファイル:外部ファイルを設置することは禁止されている自分布のように /usr/lib/ldscripts 使用しないデフォルトです。

エコーのリンカスクリプトを使用することと

ld -verbose | less

助2.24います。

.text           :
{
  *(.text.unlikely .text.*_unlikely .text.unlikely.*)
  *(.text.exit .text.exit.*)
  *(.text.startup .text.startup.*)
  *(.text.hot .text.hot.*)
  *(.text .stub .text.* .gnu.linkonce.t.*)
  /* .gnu.warning sections are handled specially by elf32.em.  */
  *(.gnu.warning)
}
.fini           :
{
  KEEP (*(SORT_NONE(.fini)))
}
PROVIDE (__etext = .);
PROVIDE (_etext = .);
PROVIDE (etext = .);
.rodata         : { *(.rodata .rodata.* .gnu.linkonce.r.*) }
.rodata1        : { *(.rodata1) }

しも行っておりますので見る

  • __etext_etext
  • etext では終わりというわけではない .text 第く .fini, るものを含むコード
  • etext は末のセグメントは、 .rodata 以下では、Binutilsダンプすべての読み取り専用部ともに同一のセグメント

PROVIDE 生弱記号:いつものと定義のシンボルドは、定義が勝利を非表示にすることです。

最小限のLinux32ビットの例

真の意味からも作品作っていきたいと思ってい極小例!

main.S:

.section .text
    /* Exit system call. */
    mov $1, %eax
    /* Exit status. */
    mov sdata, %ebx
    int $0x80
.section .data
    .byte 2

link.ld:

SECTIONS
{
    . = 0x400000;
    .text :
    {
        *(.text)
        sdata = .;
        *(.data)
    }
}

コンパイルや実行します:

gas --32 -o main.o main.S
ld -m elf_i386 -o main -T link.ld main.o
./main
echo $?

出力:

 2

説明: sdata ポイントの最初のバイトを開始 .data る部門です。

その制御による最初のバイトのことをいたしました管理の終了ステータス!

この例では、GitHub.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top