Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

151
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda