Informática en general > Dudas informáticas

 Direcciones En Un Ejecutable

(1/3) > >>

su -:
De este simple codigo:

--- Código: Text ---main(){   return(0);} 
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
--- Fin de la cita ---

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
--- Fin de la cita ---

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:

Eternal Idol:
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).

su -:
Mhhh... Si, tienes razon.

Entonces el main() seria esto? (codigo recompilado, en otra maquina)

--- Código: Text ---08048344 &#60;main&#62;: 8048344:       8d 4c 24 04             lea    0x4(%esp),%ecx 8048348:       83 e4 f0                and    &#036;0xfffffff0,%esp 804834b:       ff 71 fc                pushl  0xfffffffc(%ecx) 804834e:       55                      push   %ebp 804834f:       89 e5                   mov    %esp,%ebp 8048351:       51                      push   %ecx 8048352:       b8 00 00 00 00          mov    &#036;0x0,%eax 8048357:       59                      pop    %ecx 8048358:       5d                      pop    %ebp 8048359:       8d 61 fc                lea    0xfffffffc(%ecx),%esp 804835c:       c3                      ret     804835d:       90                      nop     804835e:       90                      nop     804835f:       90                      nop     
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.

Eternal Idol:
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.

su -:
Bien, gracias!

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa