Había escrito un programa c simple y estaba tratando de usar GDB para depurar el programa. Entiendo el uso de lo siguiente en la función principal:
Al entrar
push %ebp mov %esp,%ebpa la salida
leave retLuego probé gdb en _start y obtuve lo siguiente
xor %ebp,%ebp pop %esi mov %esp,%ecx and $0xfffffff0,%esp push %eax push %esp push %edx push $0x80484d0 push $0x8048470 push %ecx push %esi push $0x8048414 call 0x8048328 <__libc_start_main@plt> hlt nop nop nop nopNo puedo entender estas líneas y la lógica detrás de esto.
¿Alguien puede proporcionar alguna guía para ayudar a explicar el código de _start ?
Aquí está la fuente de ensamblaje bien comentada del código que publicó.
Resumiendo, hace las siguientes cosas:
esi para que podamos pasarlos a __libc_start_main__libc_csu_fini , __libc_csu_init , el vector de argumentos, el número de argumentos y la dirección de main se envían como argumentos a __libc_start_main__libc_start_main . Esta función (código fuente aquí ) configura algunas variables internas de glibc y eventualmente llama a main . Nunca regresa.__libc_start_main regresa, se coloca una instrucción hlt después. Esta instrucción no está permitida en el código de usuario y debería hacer que el programa se bloquee (con suerte).nop , por lo que la siguiente función comienza en un múltiplo de 16 bytes para un mejor rendimiento. Nunca se alcanza en la ejecución normal.para las herramientas gnu, la etiqueta _start es el punto de entrada del programa. para que el lenguaje C funcione, debe tener una pila, debe tener algunas variables/memoria puestas a cero y algunas configuradas con los valores que eligió:
int x = 5; int y; int fun ( void ) { static int z; }las tres variables x,y,z son esencialmente globales, una es global local. ya que lo escribimos de esa manera asumimos que cuando nuestro programa inicia x contiene el valor 5 y se asume que y es cero. para que esas cosas sucedan, se requiere un código de arranque y eso es lo que sucede (y más) entre _start y main().
Otras cadenas de herramientas pueden elegir usar una etiqueta diferente para definir el punto de entrada/inicio, pero las herramientas gnu usan _start. puede haber otras cosas que requieran sus herramientas antes de que main() se llame C++, por ejemplo, requiere más que C.