• Viernes 8 de Noviembre de 2024, 21:40

Autor Tema:  Direcciones En Un Ejecutable  (Leído 2901 veces)

su -

  • Moderador
  • ******
  • Mensajes: 2349
    • Ver Perfil
Direcciones En Un Ejecutable
« en: Jueves 14 de Junio de 2007, 23:18 »
0
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:
*******PELIGRO LEE ESTO!!*******

There is no place like 127.0.0.1

Conecto luego existo, no conecto luego insisto.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Direcciones En Un Ejecutable
« Respuesta #1 en: Jueves 14 de Junio de 2007, 23:32 »
0
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).

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

su -

  • Moderador
  • ******
  • Mensajes: 2349
    • Ver Perfil
Re: Direcciones En Un Ejecutable
« Respuesta #2 en: Viernes 15 de Junio de 2007, 01:27 »
0
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.
*******PELIGRO LEE ESTO!!*******

There is no place like 127.0.0.1

Conecto luego existo, no conecto luego insisto.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Direcciones En Un Ejecutable
« Respuesta #3 en: Viernes 15 de Junio de 2007, 09:23 »
0
Salen del ELF: 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.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

su -

  • Moderador
  • ******
  • Mensajes: 2349
    • Ver Perfil
Re: Direcciones En Un Ejecutable
« Respuesta #4 en: Viernes 15 de Junio de 2007, 21:09 »
0
Bien, gracias!
*******PELIGRO LEE ESTO!!*******

There is no place like 127.0.0.1

Conecto luego existo, no conecto luego insisto.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Direcciones En Un Ejecutable
« Respuesta #5 en: Viernes 15 de Junio de 2007, 21:17 »
0
De nadas  B)

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

su -

  • Moderador
  • ******
  • Mensajes: 2349
    • Ver Perfil
Re: Direcciones En Un Ejecutable
« Respuesta #6 en: Viernes 15 de Junio de 2007, 22:40 »
0
Algo mas:
La direccion esta sujeta al *-endian (big-endian, little-endian)?
*******PELIGRO LEE ESTO!!*******

There is no place like 127.0.0.1

Conecto luego existo, no conecto luego insisto.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Direcciones En Un Ejecutable
« Respuesta #7 en: Viernes 15 de Junio de 2007, 22:57 »
0

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

su -

  • Moderador
  • ******
  • Mensajes: 2349
    • Ver Perfil
Re: Direcciones En Un Ejecutable
« Respuesta #8 en: Viernes 15 de Junio de 2007, 23:16 »
0

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.
*******PELIGRO LEE ESTO!!*******

There is no place like 127.0.0.1

Conecto luego existo, no conecto luego insisto.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Direcciones En Un Ejecutable
« Respuesta #9 en: Viernes 15 de Junio de 2007, 23:21 »
0
De nadas  :kicking:

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Direcciones En Un Ejecutable
« Respuesta #10 en: Sábado 16 de Junio de 2007, 00:12 »
0
Cita de: "su -"

No te merecemos, no te merecemos  :P
 
Jajajaj, la verdad que no. :rolleyes:  :P