とWhy do virtual memory addresses for linux binaries start at 0x8048000?をフォローすると、なぜはld -e
のデフォルト以外のエントリポイントを使用できないのですか?ELFエントリポイント0x8048000が "ld -e"オプションで変更できないのはなぜですか?
私がそうした場合、デフォルトエントリーポイントの近くにあるアドレスの場合でも、戻りコード139でsegmentation fault
が得られます。どうして?
EDIT:
私は質問をより具体的になります。
.text
.globl _start
_start:
movl $0x4,%eax # eax = code for 'write' system call
movl $1,%ebx # ebx = file descriptor to standard output
movl $message,%ecx # ecx = pointer to the message
movl $13,%edx # edx = length of the message
int $0x80 # make the system call
movl $0x0,%ebx # the status returned by 'exit'
movl $0x1,%eax # eax = code for 'exit' system call
int $0x80 # make the system call
.data
.globl message
message:
.string "Hello world\n" # The message as data
私はas program.s -o program.o
でこれをコンパイルしld -N program.o -o program
と静的にリンクする場合は、テキストのVirtAddr
としてreadelf -l program
ショーを0x0000000000400078
セグメントと0x400078
エントリポイントとして。実行すると、 `こんにちは、世界は」印刷されています。
をしかし、私は、プログラムがreadelf -l
でそれを点検することになりました二つの異なるヘッダを示しています。killed
になります(4バイトでテキストセグメントとエントリポイントを移動)ld -N -e0x400082 -Ttext=0x400082 program.o -o program
とリンクしようとすると、タイプLOAD
、0x0000000000400082
で1と0x00000000004000b0
1つ。
の私は0x400086
をしようとすると、それはすべての作品、そして唯一のLOAD
のセクションがあります。
- ここで何が起こっている?
- どのメモリアドレスを選ぶことができますか?どのメモリアドレスを選ぶことができないのですか?
ありがとう。
私もリンカスクリプトでのエントリポイントを修正することができました:http://stackoverflow.com/a/30536800/895245 –