Cuando analizo /usr/bin/diff con gdb , veo que __gmon_start__ se llama antes que _start por algún motivo. Todos los documentos que he encontrado hasta ahora afirman que _start es el punto de entrada de un programa; y el campo de punto de entrada en el encabezado ELF también apunta a la dirección de _start .
¿Por qué diff no comienza a ejecutarse con _start ; y donde se guarda esa informacion?
Cada documento que he encontrado hasta ahora afirma que _start es el punto de entrada de un programa
Para ejecutables completamente estáticos, esto es cierto.
Para un ejecutable vinculado dinámicamente, las ejecuciones en el espacio de usuario comienzan en el símbolo _start del cargador ( ld.so ), y generalmente hay decenas de miles de instrucciones y muchas llamadas al sistema ejecutadas antes de que el cargador llame a _start en el a.out .
En el proceso de llegar a _start in a.out , se podrían llamar funciones del ejecutable principal (y eso es lo que está observando).