2010-08-23 17 views
9

Oye, he creado un archivo ELF a mano, tiene dos secciones (.text y .shstrtab) y un encabezado de programa que carga la sección .text. La sección .text es muy pequeño y sólo consta de los siguientes tres instrucciones ...archivo ELF a mano

# and exit 
    movl $0,%ebx  # first argument: exit code 
    movl $1,%eax  # system call number (sys_exit) 
    int  $0x80   # call kernel 

la readelf no se queja cuando lo ejecuto en este archivo ELF. Si exijo este archivo, tan pronto como lo ejecute, se destruye y aparece el mensaje "Muerto" en la pantalla. He pasado por la siguiente publicación aquí en stackoverflow y todavía estoy pasando por ello.

Ahora mi preocupación es que este programa no solicita ninguna memoria (adicional) y también ¿es realmente posible hacer una ELF a mano y esperar que el sistema la tolere?

Gracias,

+0

¿Ha leído http: // www.muppetlabs.com/~breadbox/software/tiny/teensy.html? Esto es ELF hecho a mano al extremo. – camh

+1

Sí, lo he leído, es una buena lectura. – Sohail

+1

¿Alguna vez encontró la causa del accidente? –

Respuesta

11

El ELF loader puede enviar SIGKILL a su proceso para una variedad de razones; es probable que tengas una mala dirección y/o longitud en algún lugar de los encabezados.

p. Ej. un segmento PT_LOAD debe asignar la parte apropiada del ejecutable a una dirección razonable (la dirección habitual para x86 Linux es 0x08048000, aunque probablemente no sea crítica siempre que esté alineada con la página, no 0, y no demasiado alta) y las direcciones en ambos el encabezado de sección .text y el punto de entrada en el encabezado ELF deben coincidir con eso.

No hay ninguna razón por la que no puedas hacer esto a mano (si el enlazador puede crearlo, ¡tú también puedes!) - si realmente quieres. Pero tenga en cuenta que si usted sólo tiene que montarlo y luego enlazar con símbolos pelados (-s la bandera a ld abajo):

$ cat exit.s 
.globl _start 
_start: 
movl $0,%ebx 
movl $1,%eax 
int $0x80 
$ as -o exit.o exit.s 
$ ld -s -o exit exit.o 
$ ./exit 
$ hexdump -Cv exit 
00000000 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 |.ELF............| 
00000010 02 00 03 00 01 00 00 00 54 80 04 08 34 00 00 00 |........T...4...| 
00000020 74 00 00 00 00 00 00 00 34 00 20 00 01 00 28 00 |t.......4. ...(.| 
00000030 03 00 02 00 01 00 00 00 00 00 00 00 00 80 04 08 |................| 
00000040 00 80 04 08 60 00 00 00 60 00 00 00 05 00 00 00 |....`...`.......| 
00000050 00 10 00 00 bb 00 00 00 00 b8 01 00 00 00 cd 80 |................| 
00000060 00 2e 73 68 73 74 72 74 61 62 00 2e 74 65 78 74 |..shstrtab..text| 
00000070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 
00000080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 
00000090 00 00 00 00 00 00 00 00 00 00 00 00 0b 00 00 00 |................| 
000000a0 01 00 00 00 06 00 00 00 54 80 04 08 54 00 00 00 |........T...T...| 
000000b0 0c 00 00 00 00 00 00 00 00 00 00 00 04 00 00 00 |................| 
000000c0 00 00 00 00 01 00 00 00 03 00 00 00 00 00 00 00 |................| 
000000d0 00 00 00 00 60 00 00 00 11 00 00 00 00 00 00 00 |....`...........| 
000000e0 00 00 00 00 01 00 00 00 00 00 00 00    |............| 
000000ec 
$ 

... entonces el resultado es bastante mínima de todas formas (probablemente lo suficientemente mínima para comparar con su mano no-hecho a mano archivo para ver dónde te has equivocado).

+0

Gracias por la respuesta, su consejo es bueno. Lo seguiré. Mi archivo hecho a mano ahora se ha vuelto bastante grande, pero aun así obtengo el mismo resultado cuando trato de ejecutarlo. Gracias una vez más por la respuesta. – Sohail

+0

Traté de votar su respuesta, pero se necesitan 15 reputaciones para hacerlo, volveré cuando tenga tantas. – Sohail

+0

La entrada PT_LOAD debe marcarse como legible y ejecutable también. – ysdx

0

Recientemente también trato de hacer experimentos similares.
Durante el proceso, también obtengo la información de error cuando ejecuto el archivo elf generado, parece que
resulta de una configuración incorrecta del viraddr y la ubicación de los segmentos, difiere su propio archivo elf
con un archivo elf estándar (compilado y vinculado).
Por cierto, a KEEY la simplicidad de la norma a.out duende, puede utilizar el parámetro -s
para eliminar las tablas de símbolos en el archivo elf: ld -s ao