2014-09-04 2 views
7

im Moment versuche ich, ein bisschen näher an Assembler-Programmierung zu bekommen und sah daher im Assembler-Code eines einfachen Welt Programm hallo:Was genau bedeutet <[email protected]>?

#include <stdio.h> 

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

Jetzt versuche ich zu verstehen, wie ein fiew einfachen Assembler-Befehle arbeiten, während gehen Schritt für Schritt durch den Assembler-Code und zu analysieren, was genau passiert:

ist
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 

Das Problem, das ich wirklich diese Zeile nicht verstehen:

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

ich an der Adresse 0x400410 auf verschiedene Weise versucht, Blick, aber ich habe nicht wirklich bekommen, was es wirklich tut:/Auch ich weiß nicht, was das genau bedeutet: <[email protected]>

groß wirklich sein würde, wenn jemand mir dies zu verstehen helfen könnte bestimmte Linie :) Grüße Sleepy

+0

puts @ plt ist ein Funktionsaufruf. http://www.cplusplus.com/reference/cstdio/puts/ – IdeaHat

+4

Siehe auch [Was bedeutet '@ plt' hier?] (https://stackoverflow.com/questions/5469274/what-does-plt-mean -here) – DCoder

+4

Es ruft die Bibliotheksfunktion 'puts()' auf, um Ihren Text zu drucken (anstelle von 'printf()' - da Sie keine Parameter übergeben, ist es gleichbedeutend mit dem Aufruf des einfacheren/schnelleren 'puts() ') –

Antwort

14

PLT bedeutet Prozedur Verknüpfungstabelle. Es ist eine spezielle Technik, die in ELF-Dateien verwendet wird, um das Fixieren zur Ladezeit auf Maschinen zu lokalisieren, auf denen relative Adressierung verfügbar ist.

Die Funktion, die Sie aufrufen, befindet sich in einem anderen Modul (normalerweise libc.so. x), daher muss die tatsächliche Adresse der Funktion angegeben werden, wenn das Programm zur Ausführung geladen wird.

PLT ist im Wesentlichen ein Bereich in Ihrer ausführbaren Datei (oder .so-Datei), in dem alle ausstehenden Referenzen zusammengefasst sind. Sie haben die Form der Sprunganweisung der Zielmaschine, wobei die tatsächliche Adresse nicht gefüllt ist. Es ist Aufgabe des Ladeprogramms, die Adressen zu füllen. Der Prozess heißt Fixieren.

Da der verbleibende Teil Ihres Moduls Funktionsaufrufe über den PLT mit relativer Adressierung ausführt und der Versatz zum PLT zum Zeitpunkt der Verknüpfung bekannt ist, muss dort nichts behoben werden. Dies bedeutet, dass der Großteil Ihres Moduls weiterhin in der Moduldatei anstatt in der Auslagerungsdatei abgebildet werden kann.

Es ist auch anzumerken, dass komplementär zu den PLT ist die GOT, Global Offset Table. Während PLT für Funktionsaufrufe verwendet wird, wird GOT für Daten verwendet.

+2

GOT enthält auch die tatsächlichen Zeiger auf externen Code, der von den PLT-Stubs verwendet wird (obwohl sie manchmal in einem separaten Abschnitt ".plt.got" gruppiert sind). –