Informática en general > Dudas informáticas
Direcciones En Un Ejecutable
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 <main>: 8048344: 8d 4c 24 04 lea 0x4(%esp),%ecx 8048348: 83 e4 f0 and $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 $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
[#] Página Siguiente
Ir a la versión completa