Seguito da Why is the ELF execution entry point virtual address of the form 0x80xxxxx and not zero 0x0? e Why do virtual memory addresses for linux binaries start at 0x8048000?, perché non posso fare ld
utilizzare un punto di ingresso diverso da quello predefinito con ld -e
?Perché il punto di ingresso ELF 0x8048000 non è modificabile con l'opzione "ld -e"?
In tal caso, ottengo uno segmentation fault
con codice di ritorno 139, anche per gli indirizzi vicini al punto di ingresso predefinito. Perché?
EDIT:
farò la domanda più specifica:
.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
Se compilo questo con as program.s -o program.o
e poi collegarlo staticamente con ld -N program.o -o program
, readelf -l program
spettacoli 0x0000000000400078
come VirtAddr
del testo segmento e come punto di ingresso. Quando viene eseguito, `Ciao mondo" viene stampato.
Tuttavia, quando provo a collegare con ld -N -e0x400082 -Ttext=0x400082 program.o -o program
(muovendo segmento di testo e punto di ingresso da 4 byte), il programma sarà killed
. Ispezionare con readelf -l
ora mostra due intestazioni differenti di tipo LOAD
, uno alla 0x0000000000400082
e uno a 0x00000000004000b0
.
Quando provo 0x400086
, tutto funziona, e c'è solo un LOAD
sezione.
- che cosa sta succedendo qui?
- Quali indirizzi di memoria posso scegliere, quali non posso scegliere e perché?
Grazie.
Sono stato anche in grado di modificare il punto di ingresso con lo script del linker: http://stackoverflow.com/a/30536800/895245 –