Se non c'è nulla da collegare (ad esempio non sto utilizzando alcuna libreria, so che non sarà di alcuna utilità.) Il linker cambierà l'output del codice oggetto dell'assembler? Se sì, cosa cambia?
Collega sempre un po 'di codice di inizializzazione. Puoi provare questo, scrivere un programma vuoto e collegarlo, quindi utilizzare objdump -d per disassemblarlo.
Ho sentito che LINKER esegue anche un'operazione di mappatura della memoria. Non capisco come. Il programma non è in esecuzione, è solo nella fase di produzione. Come potrebbe il linker mappare alla memoria? Come sarebbe? Quali sono tutte le funzioni di LINKER?
Ogni sistema ha un layout di memoria che i programmi eseguibili devono seguire per funzionare. Specifica dove vanno le diverse parti del programma (almeno codice, dati inizializzati, dati inizializzati a zero). Il linker deve produrre l'eseguibile in base a queste regole, che variano tra i sistemi, ad es. Windows e Linux.Sui sistemi embedded diventa ancora più interessante, lì il programma è in genere in memoria di sola lettura (Flash) ei dati sono nella RAM, e ci sono intervalli di indirizzi fissi per i diversi tipi di memoria a seconda del tipo di microcontrollore.
Quando le persone fanno riferimento a "relocation", "address binding". Non capisco cosa significano. Che cos'è & qual è il suo scopo?
Binding in generale significa dare un valore a un nome, in questo caso un indirizzo al simbolo per una funzione o variabile globale.
Per quanto riguarda il riposizionamento, in genere si collegano più di un file oggetto e ogni file oggetto specifica gli indirizzi come offset relativi al suo inizio. Quando li metti insieme ognuno ottiene il proprio intervallo di indirizzi e il linker calcola l'indirizzo per un simbolo mappando l'offset nell'intervallo di indirizzi. Questo è chiamato trasferimento.
Alcuni debugger mostrano informazioni come: stack di chiamate: 0xfffef32, 0xf3234fe ecc. È in fase di esecuzione giusto? o sono gli indirizzi di memoria della cosiddetta "mappatura della memoria" del linker?
Questo 0xfffef32 sarebbe un indirizzo tipico nello stack, poiché lo stack di solito è posizionato nella parte superiore della memoria e cresce verso il basso. Lo stack viene utilizzato per gli indirizzi di ritorno, le variabili locali e i parametri delle funzioni effettive. Questi sono locali e memorizzati in indirizzi relativi al puntatore dello stack, quindi non sono gestiti tipicamente dal linker, piuttosto il compilatore conosce già gli offset da usare e li inserisce nel codice assembly.
quando le persone si riferiscono a qualcosa come simboli o tabella dei simboli. Significano identificatori (nomi di variabili, nomi costanti, nomi di funzioni)?
La tabella dei simboli è una tabella che associa i simboli ai valori (numeri, offset, indirizzi). Ci sono alcuni simboli per i tuoi identificatori, ma anche altri per altri usi. I tuoi identificatori possono essere modificati più o meno per diventare simboli, principalmente per evitare conflitti tra nomi (ad esempio la preposizione di "_").
Il linker ha un'opzione --print-map per stampare la tabella dei simboli. Puoi usare -Wl, - print-map se usi gcc per il collegamento.
Se ti piace questo tipo di materiale tecnico di basso livello, dovresti dare un'occhiata alla programmazione incorporata, cioè i microcontrollori di programmazione che sono usati in vari dispositivi elettrici. Per i sistemi desktop come Windows normalmente non è necessario consultare questo tipo di dettagli.
Sarebbe utile specificare la lingua e il linker che si sta utilizzando. Linker diversi possono fare cose leggermente diverse. –