Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

301
Views
¿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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!