Qualsiasi esercizio pratico per capire come un programma viene caricato in memoria e come eseguito

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

  •  06-07-2019
  •  | 
  •  

Domanda

Sono curioso di sapere cosa succede prima che venga chiamato main (), come caricare l'eseguibile in memoria, caricare dinamicamente la libreria condivisa. Hai qualche suggerimento su come capire queste cose con un esercizio pratico?

Gli strumenti e le cose che conosco e che utilizzo ora includono:

  • strace
  • smontare
  • readelf
  • / proc / PID / mappa

NOTE: Conosco l'ottimo libro linker e caricatori , ma mani- sull'esercizio fisico può insegnarmi meglio della lettura del libro.

È stato utile?

Soluzione

  • La ld.so man page documenti diverse variabili di ambiente che possono essere impostate per modificare il processo di collegamento dinamico o fornire dettagli aggiuntivi.

es.

LD_DEBUG=all cat </dev/null
  • Puoi facilmente ottenere il codice sorgente per ogni singolo pezzo coinvolto - kernel Linux, linker dinamico, libreria C, codice di avvio (crt0.o o simile). Puoi iniziare studiando il codice e apportando modifiche sperimentali.

Altri suggerimenti

Se vuoi controllare come è compresso un binario e le diverse sezioni di esso penso che il miglior programma là fuori sia objdump .

Scegli qualunque eseguibile e fai:


objdump -S <executable>  > myfile.S

Un altro buon esercizio sarà:

  • Crea un programma che utilizza una libreria esterna
  • Compila il programma usando il collegamento statico
  • Esegui il programma
  • Rinomina il file della libreria e controlla se il programma è in esecuzione
  • Compila il programma usando la libreria condivisa
  • Rinomina la libreria e controlla se il programma è in esecuzione

Questo risponderà ad alcune delle tue domande su cosa sta succedendo sotto le tende e come.

Ho trovato due interessanti collegamenti correlati (almeno per Linux) e un po 'più brevi del libro citato (Linker e Caricatori)

Quando ho seguito una lezione di OS al college, abbiamo usato Nachos . Non è un sistema operativo di per sé , ma una sorta di sistema operativo "simulazione". che viene eseguito nello spazio utente. È scritto in C ++ e puoi eseguire la compilazione incrociata di file eseguibili che Nachos può quindi caricare ed eseguire. Puoi giocare con l'interfaccia di chiamata di sistema e, in generale, sperimentare quanto vuoi giocando con il codice.

L'abbiamo eseguito in un laboratorio Solaris e ho avuto qualche problema a metterlo in funzione su Linux sulla mia macchina personale, ma potrebbe essere un giocattolo divertente se sei disposto a scavare in qualche codice.

Mi rendo conto che probabilmente è molto per quello che stai cercando, ma scrivere il tuo assemblatore e linker sarebbe molto istruttivo. L'ho fatto quando ero al college e l'ho adorato. Ci sono volute forse 120 ore di lavoro mentre ricordo di farlo funzionare per le cose di base che volevo che facesse. Penso che questo progetto più di ogni altra cosa mi abbia reso certo che una carriera nella programmazione era per me.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top