2014-09-04 20 views
7

w tej chwili staram się dostać nieco bliżej do programowania asemblera i dlatego wyglądał na kod asemblera z łatwym programu Hello World:Co dokładnie oznacza <[email protected]>?

#include <stdio.h> 

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

Teraz staram się zrozumieć, w jaki sposób pracować fiew proste rozkazy asemblera idąc krok po kroku przez asemblerze i analizując, co dokładnie się dzieje:

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 

Problemem jest to, że ja naprawdę nie rozumiem tej linii:

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

Próbowałem patrząc na adres 0x400410 na różne sposoby, ale ja naprawdę nie rozumiem, co to naprawdę robi:/Również nie wiem co to dokładnie oznacza: <[email protected]>

Byłoby naprawdę wspaniale, jeśli ktoś może mi pomóc to zrozumieć konkretna linia :) Pozdrowienia Sleepy

+0

puts @ plt to wywołanie funkcji. http://www.cplusplus.com/reference/cstdio/puts/ – IdeaHat

+4

Zobacz także [Co znaczy "@ plt" tutaj?] (https://stackoverflow.com/questions/5469274/what-does-plt-mean -tutaj) – DCoder

+4

Wywołuje funkcję biblioteczną 'puts()', która drukuje twój tekst (zamiast 'printf()' - ponieważ nie przekazujesz żadnych parametrów, jest to równoważne wywołaniu prostszego/szybszego 'puts() ') –

Odpowiedz

14

PLT oznacza tabelę powiązań procedury. Jest to specjalna technika używana w plikach ELF do lokalizowania poprawek w czasie ładowania na komputerach, na których dostępne jest względne adresowanie.

Funkcja, do której dzwonisz, znajduje się w innym module (zazwyczaj libc.so. x), dlatego rzeczywisty adres funkcji musi być podany, gdy program jest załadowany do wykonania.

PLT to zasadniczo obszar w pliku wykonywalnym (lub pliku .so), w którym gromadzone są wszystkie zaległe referencje. Mają postać instrukcji skoku docelowej maszyny, a faktyczny adres pozostaje nieobsadzony. Od wypełniacza adresów zależy od program ładujący. Proces nazywa się naprawianiem.

Ponieważ pozostała część twojego modułu wykonuje wywołania funkcji za pomocą PLT za pomocą względnego adresowania, a przesunięcie do PLT jest znane w momencie łączenia, nic nie musi być tam naprawiane. Oznacza to, że większość twojego modułu może być nadal mapowana na plik modułu zamiast na plik wymiany.

Należy również zauważyć, że uzupełnieniem PLT jest GOT, Global Offset Table. Podczas gdy PLT jest używany do wywoływania funkcji, GOT jest używany do danych.

+2

GOT zawiera również aktualne wskaźniki do kodu zewnętrznego używanego przez kody pośredniczące PLT (choć czasami są one zgrupowane w oddzielnej sekcji '.plt.got'). –