SoloCodigo

Informática en general => Dudas informáticas => Mensaje iniciado por: su - en Jueves 14 de Junio de 2007, 23:18

Título: Direcciones En Un Ejecutable
Publicado por: su - en Jueves 14 de Junio de 2007, 23:18
De este simple codigo:
Código: Text
  1. main()
  2. {
  3.    return(0);
  4. }
  5.  

Lo compilo, y luego ejecuto "objdump -f ejecutable" que me da lo siguiente:
Citar
ejecutable:     file format elf32-i386
architecture: i386, flags 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
start address 0x080482d0

Bien, luego: objdump --disassemble ejecutable

Y eso me da:

Citar
080482d0 <_start>:
 80482d0:       31 ed                   xor    %ebp,%ebp
 80482d2:       5e                      pop    %esi
 80482d3:       89 e1                   mov    %esp,%ecx
 80482d5:       83 e4 f0                and    $0xfffffff0,%esp
 80482d8:       50                      push   %eax
 80482d9:       54                      push   %esp
 80482da:       52                      push   %edx
 80482db:       68 20 84 04 08          push   $0x8048420
 80482e0:       68 74 82 04 08          push   $0x8048274
 80482e5:       51                      push   %ecx
 80482e6:       56                      push   %esi
 80482e7:       68 d0 83 04 08          push   $0x80483d0
 80482ec:       e8 cb ff ff ff          call   80482bc <_init+0x48>
 80482f1:       f4                      hlt   
 80482f2:       89 f6                   mov    %esi,%esi

Bien, se supone que 080482d0 es el main() del programa.

Que hace esactamente esta direccion y como la determina el linker?
Y las otras direcciones... de donde salen?  :unsure:
Título: Re: Direcciones En Un Ejecutable
Publicado por: Eternal Idol en Jueves 14 de Junio de 2007, 23:32
Ese no es el main, si te fijas ahi hay mucho codigo, es imposible que se corresponda con tu return 0, ademas hay hasta una llamada a una funcion (_init) y ahi claramente se muestra con el nombre de _start esa funcion. Eso es mas bien el punto de entrada de la RTL de C.

Todas esas direcciones estan en el formato del ejecutable que le corresponda (en este caso ELF).
Título: Re: Direcciones En Un Ejecutable
Publicado por: su - en Viernes 15 de Junio de 2007, 01:27
Mhhh... Si, tienes razon.

Entonces el main() seria esto? (codigo recompilado, en otra maquina)
Código: Text
  1. 08048344 &#60;main&#62;:
  2.  8048344:       8d 4c 24 04             lea    0x4(%esp),%ecx
  3.  8048348:       83 e4 f0                and    &#036;0xfffffff0,%esp
  4.  804834b:       ff 71 fc                pushl  0xfffffffc(%ecx)
  5.  804834e:       55                      push   %ebp
  6.  804834f:       89 e5                   mov    %esp,%ebp
  7.  8048351:       51                      push   %ecx
  8.  8048352:       b8 00 00 00 00          mov    &#036;0x0,%eax
  9.  8048357:       59                      pop    %ecx
  10.  8048358:       5d                      pop    %ebp
  11.  8048359:       8d 61 fc                lea    0xfffffffc(%ecx),%esp
  12.  804835c:       c3                      ret    
  13.  804835d:       90                      nop    
  14.  804835e:       90                      nop    
  15.  804835f:       90                      nop    
  16.  

Bueno, es que da cada parte del ELF, pero la pregunta es las direcciones... de donde salen?
He buscado pero no encuentro algo al respecto.  :ph34r:

Lo que mas me interesa es el start address (dado por objdump -f ejecutable) que ironicamente ¡me da (esta vez) algo comparable: 0x80482a0, ya se que es diferente pero no entiendo esto como es asignado.
Título: Re: Direcciones En Un Ejecutable
Publicado por: Eternal Idol en Viernes 15 de Junio de 2007, 09:23
Salen del ELF: http://en.wikipedia.org/wiki/Executable_and_Linkable_Format (http://en.wikipedia.org/wiki/Executable_and_Linkable_Format)

En su/s cabecera/s habra un campo que indique en que direccion virtual (relativa a la direccion base) debe cargarse cada una de las secciones del ejecutable y el punto de entrada. Seguramente en el enlazador exista alguna opcion para cambiar la direccion base ... estas direcciones como decia antes son virtuales y ademas generalmente los modulos pueden ser cargados en otras direcciones (mas que nada las librerias, al ser el ejecutable lo primero en cargar en un proceso) para lo cual hay que aplicar cambios en todas las instrucciones del codigo que no usen offsets.
Título: Re: Direcciones En Un Ejecutable
Publicado por: su - en Viernes 15 de Junio de 2007, 21:09
Bien, gracias!
Título: Re: Direcciones En Un Ejecutable
Publicado por: Eternal Idol en Viernes 15 de Junio de 2007, 21:17
De nadas  B)
Título: Re: Direcciones En Un Ejecutable
Publicado por: su - en Viernes 15 de Junio de 2007, 22:40
Algo mas:
La direccion esta sujeta al *-endian (big-endian, little-endian)?
Título: Re: Direcciones En Un Ejecutable
Publicado por: Eternal Idol en Viernes 15 de Junio de 2007, 22:57
http://www.ibm.com/developerworks/power/li...ec12/index.html (http://www.ibm.com/developerworks/power/library/pa-spec12/index.html)
Título: Re: Direcciones En Un Ejecutable
Publicado por: su - en Viernes 15 de Junio de 2007, 23:16
(http://i2.photobucket.com/albums/y5/rocknrollgirl/praise.gif)
No te merecemos, no te merecemos  :P

Pero encontre otra forma de sacar esta info sin importar que endian es, perl lo saca usando una funcion (llamada pack) que lo hace de forma nativa (o no nativa, claro).

Gracias nuevamente.
Título: Re: Direcciones En Un Ejecutable
Publicado por: Eternal Idol en Viernes 15 de Junio de 2007, 23:21
De nadas  :kicking:
Título: Re: Direcciones En Un Ejecutable
Publicado por: Enko en Sábado 16 de Junio de 2007, 00:12
Cita de: "su -"
(http://i2.photobucket.com/albums/y5/rocknrollgirl/praise.gif)
No te merecemos, no te merecemos  :P
 
Jajajaj, la verdad que no. :rolleyes:  :P