2014-09-04 37 views
7

in questo momento cerco di ottenere un po 'più vicino alla programmazione assembler e quindi guardato il codice assembler di un semplice programma di mondo ciao:Che cosa significa esattamente <[email protected]>?

#include <stdio.h> 

int main() 
{ 
    int i; 
    for(i=0; i<10; i++) 
    { 
     printf("Hello, world!\n"); 
    } 
    return 0; 
} 

Ora cerco di capire come lavorare un fiew semplici comandi assemblatore, mentre andando passo per passo attraverso il codice assemblatore e analizzando cosa succede esattamente:

0x000000000040052d <+0>: push rbp 
    0x000000000040052e <+1>: mov rbp,rsp 
    0x0000000000400531 <+4>: sub rsp,0x10 
    0x0000000000400535 <+8>: mov DWORD PTR [rbp-0x4],0x0 
    0x000000000040053c <+15>: jmp 0x40054c <main+31> 
    0x000000000040053e <+17>: mov edi,0x4005e4 
    0x0000000000400543 <+22>: call 0x400410 <[email protected]> 
    0x0000000000400548 <+27>: add DWORD PTR [rbp-0x4],0x1 
    0x000000000040054c <+31>: cmp DWORD PTR [rbp-0x4],0x9 
    0x0000000000400550 <+35>: jle 0x40053e <main+17> 
    0x0000000000400552 <+37>: mov eax,0x0 
    0x0000000000400557 <+42>: leave 
    0x0000000000400558 <+43>: ret 

il problema è che realmente non capisce questa riga:

0x0000000000400543 <+22>: call 0x400410 <[email protected]> 

Ho provato a guardare l'indirizzo 0x400410 in vari modi, ma io non realmente ottenere ciò di cui ha realmente:/Anche io non so cosa significa esattamente: <[email protected]>

sarebbe davvero bello se qualcuno mi potrebbe aiutare a capire questo riga specifica :) Saluti assonnati

+0

puts @ plt è una chiamata di funzione. http://www.cplusplus.com/reference/cstdio/puts/ – IdeaHat

+4

Vedi anche [Cosa significa '@ plt' qui?] (https://stackoverflow.com/questions/5469274/what-does-plt-mean -qui) – DCoder

+4

Si chiama la funzione di libreria 'puts()' per stampare il testo (al posto di 'printf()' - poiché non si passa alcun parametro, equivale a chiamare il più semplice/veloce 'puts() ') –

risposta

14

PLT significa tabella concatenamento procedura. È una tecnica speciale utilizzata nei file ELF per localizzare il fixing al momento del caricamento su macchine in cui è disponibile l'indirizzamento relativo.

La funzione che si sta chiamando si trova in un altro modulo (tipicamente, libc.so. x), pertanto l'indirizzo effettivo della funzione deve essere fornito quando il programma viene caricato per l'esecuzione.

PLT è essenzialmente un'area del file eseguibile (o del file .so) in cui vengono raccolti tutti i riferimenti eccezionali. Hanno la forma dell'istruzione di salto della macchina target con l'indirizzo effettivo che rimane non riempito. Spetta al caricatore per riempire gli indirizzi. Il processo è chiamato aggiustare.

Poiché la parte restante del modulo effettua chiamate di funzione attraverso il PLT utilizzando l'indirizzamento relativo e l'offset al PLT è noto al momento del collegamento, non è necessario ripararlo. Ciò significa che la maggior parte del tuo modulo potrebbe continuare a essere mappata sul file del modulo anziché sul file di scambio.

Va inoltre notato che complementare al PLT è il GOT, Global Offset Table. Mentre PLT viene utilizzato per le chiamate di funzione, GOT viene utilizzato per i dati.

+2

GOT contiene anche i puntatori effettivi al codice esterno utilizzato dagli stub PLT (anche se a volte sono raggruppati in una sezione separata '.plt.got'). –

Problemi correlati