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

302
Vistas
¿Por qué se llama _init desde csu/init-first.c de glibc antes de _start incluso si _start es el punto de entrada de ELF?

Lo noté por primera vez mientras jugaba con rbreak . , y luego hizo un ejemplo mínimo:

 (gdb) file hello_world.out Reading symbols from hello_world.out...done. (gdb) b _init Breakpoint 1 at 0x4003e0 (gdb) b _start Breakpoint 2 at 0x400440 (gdb) run Starting program: /home/ciro/bak/git/cpp/cheat/gdb/hello_world.out Breakpoint 1, _init (argc=1, argv=0x7fffffffd698, envp=0x7fffffffd6a8) at ../csu/init-first.c:52 52 ../csu/init-first.c: No such file or directory. (gdb) continue Continuing. Breakpoint 2, 0x0000000000400440 in _start () (gdb) continue Continuing. Breakpoint 1, 0x00000000004003e0 in _init () (gdb) info breakpoints Num Type Disp Enb Address What 1 breakpoint keep y <MULTIPLE> breakpoint already hit 2 times 1.1 y 0x00000000004003e0 <_init> 1.2 y 0x00007ffff7a36c20 in _init at ../csu/init-first.c:52 2 breakpoint keep y 0x0000000000400440 <_start> breakpoint already hit 1 time

Tenga en cuenta que hay 2 _init : uno en csu/init-first.c , y el otro parece provenir de sysdeps/x86_64/crti.S . Estoy hablando de la csu .

¿No se supone que _start es el punto de entrada establecido por el enlazador y almacenado en el encabezado ELF? ¿Qué mecanismo hace que _init se ejecute primero? ¿Cual es su propósito?

Probado en GCC 4.8, glibc 2.19, GDB 7.7.1 y Ubuntu 14.04.

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

0

Donde el depurador se detiene primero en su ejemplo no es el comienzo real del proceso.

En el encabezado ELF hay una entrada para el intérprete de programa (vinculador dinámico). En Linux de 64 bits, su valor es /lib64/ld-linux-x86-64.so.2 . El núcleo establece el puntero de instrucción inicial en el punto de entrada de este intérprete de programa . El nombre del símbolo también es _start , como los programas _start .

Después de que el enlazador dinámico haya hecho su trabajo, llamando también a funciones en el programa, como _init en glibc, llama al punto de entrada del programa.

El punto de interrupción en _start no funciona para el enlazador dinámico porque solo toma la dirección del _start del programa.

Puede encontrar la dirección del punto de entrada con readelf -h /lib64/ld-linux-x86-64.so.2 .

También puede establecer un punto de interrupción en _dl_start e imprimir un seguimiento para ver que esta función se llama desde el _start del enlazador dinámico.

Si descarga el código fuente actual de glibc, puede encontrar el punto de entrada del cargador dinámico en glibc-2.21/sysdeps/x86_64/dl-machine.h a partir de la línea 121.

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