Cualquier ejercicio práctico para comprender cómo se carga un programa en la memoria y se ejecuta

StackOverflow https://stackoverflow.com/questions/1210522

  •  06-07-2019
  •  | 
  •  

Pregunta

Tengo curiosidad acerca de las cosas que sucedieron antes de que se llame a main (), como cargar el ejecutable en la memoria, carga dinámica de la biblioteca compartida. ¿Tiene alguna sugerencia sobre cómo entender estas cosas mediante un ejercicio práctico?

Las herramientas y cosas que conozco, y que uso ahora, incluyen:

  • strace
  • desmontar
  • readelf
  • / proc / pid / map

NOTAS: Conozco el gran libro enlazadores y cargadores , pero manos- en el ejercicio puede enseñarme mejor que leer el libro.

¿Fue útil?

Solución

  • Los documentos ld.so man page varias variables de entorno que se pueden configurar para ajustar el proceso de enlace dinámico o proporcionar detalles adicionales.

p.

LD_DEBUG=all cat </dev/null
  • Puede obtener fácilmente el código fuente de cada pieza involucrada: kernel de Linux, enlazador dinámico, biblioteca C, código de inicio (crt0.o o similar). Puede comenzar estudiando el código y haciendo modificaciones experimentales.

Otros consejos

Si desea verificar cómo se empaqueta un binario y las diferentes secciones, creo que el mejor programa es objdump .

Elija cualquier ejecutable y haga:


objdump -S <executable>  > myfile.S

Otro buen ejercicio será:

  • Crea un programa que usa una biblioteca externa
  • Compile el programa usando enlaces estáticos
  • Ejecute el programa
  • Cambie el nombre del archivo de la biblioteca y compruebe si el programa se ejecuta
  • Compile el programa usando la biblioteca compartida
  • Cambie el nombre de la biblioteca y compruebe si el programa se ejecuta

Eso responderá algunas de sus preguntas sobre lo que sucede debajo de las cortinas y cómo.

Encontré dos enlaces relacionados interesantes (al menos para Linux) y un poco más cortos que el libro mencionado (Linkers and Loaders)

Cuando tomé una clase de SO en la universidad, usamos Nachos . No es un sistema operativo per se , sino una especie de sistema operativo "simulación" que se ejecuta en espacio de usuario. Está escrito en C ++ y puede compilar archivos ejecutables que Nachos puede cargar y ejecutar. Puedes jugar con la interfaz de llamada del sistema y, en general, experimentar todo lo que quieras jugando con el código.

Lo ejecutamos en un laboratorio de Solaris, y tuve algunos problemas para ponerlo en funcionamiento en Linux en mi máquina personal, pero podría ser un juguete divertido si estás dispuesto a profundizar en algún código.

Me doy cuenta de que probablemente sea mucho para lo que estás buscando, pero escribir tu propio ensamblador y enlazador sería muy educativo. Lo hice cuando estaba en la universidad y me encantó. Tomé tal vez 120 horas de trabajo, según recuerdo, para que funcione para las cosas básicas que quería que hiciera. Creo que este proyecto más que cualquier otra cosa me aseguró que una carrera en programación era para mí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top