質問
これは、コードから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
る部門です。
その制御による最初のバイトのことをいたしました管理の終了ステータス!
所属していません StackOverflow