2013-12-10 16 views
10

Sono curioso di sapere perché esiste la tabella di collegamento della procedura. Quale scopo serve? L'assembly non può chiamare direttamente la tabella di offset globale? Quale vantaggio chiama il PLT a chiamare il Global Offset Table?Qual è lo scopo della tabella di collegamento della procedura?

L'intero processo è ancora un po 'di confusione per me e sto cercando di capire gli ingressi e i fuori del collegamento dinamico così ogni aiuto sarebbe apprezzato.

+0

possibile duplicato di [Tabella concatenamento processo e tabella offset globale] (http://stackoverflow.com/questions/9688076/process-linkage-table-and-global-offset-table) –

+1

Questa domanda non risponde alla mia domanda a tutti – Rell3oT

risposta

9

Per le chiamate effettuate dal codice PIC, si è certi che il PLT non è realmente necessario. Il compilatore poteva benissimo generare una ricerca GOT e una chiamata indiretta all'indirizzo ottenuto dal GOT. L'uso di un PLT tende a rendere il codice leggermente più efficiente anche se (almeno, meno ingombro per chiamata), quindi è generalmente utilizzato in ogni caso.

Laddove il PLT è assolutamente necessario, tuttavia, è in codice non-PIC collegato in modo dinamico. (Solitamente ciò si verifica solo nel programma principale, su molti arch, il codice non PIC non è nemmeno consentito/supportato nelle librerie condivise.) Quando il compilatore genera un codice non PIC per una chiamata di funzione, non ha modo di sapere che il l'indirizzo di destinazione effettivo verrà risolto dinamicamente in fase di esecuzione tramite GOT. Quindi genera solo una normale istruzione di chiamata. Il linker è quindi responsabile quando vede un trasferimento del tipo di chiamata per un simbolo che non è risolto localmente e che richiede il collegamento in runtime, per generare una voce PLT che carica l'indirizzo dal GOT e fa un salto indiretto ad esso. In questo modo, il codice di chiamata della funzione non PIC originale non viene modificato.

+0

Grande! Un'ultima domanda. Cosa avrebbe dovuto fare il GOT in modo diverso nel codice PIC se non ci fosse il PLT? Più specificamente ... Perché dovrebbe essere più gonfio? – Rell3oT

+0

Fintanto che passa attraverso il PLT, una chiamata dal codice PIC di solito sembra identica a una chiamata da un codice non PIC, vale a dire una singola istruzione di chiamata relativa al PC. (Potrebbe avere requisiti aggiuntivi che il registro GOT è già stato caricato, tuttavia, questo è specifico per l'arco.) Una chiamata tramite il GOT senza utilizzare il PLT sarebbe la stessa di quella del codice normalmente inserito nella voce PLT, che è tipicamente 2-3 istruzioni per caricare l'indirizzo effettivo della funzione e saltare ad esso. –

+0

Va bene questo è quello che ho pensato. Immagino che il grosso sarebbe abbastanza consistente nel caso in cui vengano chiamate molte funzioni diverse, quindi è bello avere due diversi 'strati 'di chiamate per una migliore comprensione. grazie – Rell3oT

Problemi correlati