Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

147
Vistas
Comprensión del lenguaje ensamblador _etiqueta de inicio en un programa C

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,%ebp

a la salida

 leave ret

Luego 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 nop

No 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 ?

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Aquí está la fuente de ensamblaje bien comentada del código que publicó.

Resumiendo, hace las siguientes cosas:

  1. establecer un marco de pila centinela con ebp = 0 para que el código que recorre la pila pueda encontrar su final fácilmente
  2. Coloque la cantidad de argumentos de la línea de comando en esi para que podamos pasarlos a __libc_start_main
  3. Alinee el puntero de la pila a un múltiplo de 16 bits para cumplir con la ABI. No se garantiza que este sea el caso en algunas versiones de Linux, por lo que debe hacerse manualmente por si acaso.
  4. Las direcciones de __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
  5. Se llama __libc_start_main . Esta función (código fuente aquí ) configura algunas variables internas de glibc y eventualmente llama a main . Nunca regresa.
  6. Si por alguna razón __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).
  7. El ensamblador inserta la serie final de instrucciones 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.
over 4 years ago · Santiago Trujillo Denunciar

0

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.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda