2014-09-04 152 views
7

目前,我試圖讓一位接近彙編編程,因此看一個簡單的Hello World程序的彙編代碼:<[email protected]>是什麼意思?

#include <stdio.h> 

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

現在我試着去理解一個fiew簡單的彙編指令是如何工作的,當去一步步通過彙編代碼一步,分析到底發生了什麼:

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 

的問題是,我不真正瞭解這一行:

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

我試圖尋找各種方式ADRESS 0x400410,但我真的不明白它確實:/還有我不知道這是什麼確切指的是:<[email protected]>

將是非常巨大的,如果有人可以幫助我理解這具體行:) 問候困

+0

puts @ plt是一個函數調用。 http://www.cplusplus.com/reference/cstdio/puts/ – IdeaHat 2014-09-04 13:51:06

+4

另請參見[@ plt是什麼意思?](https://stackoverflow.com/questions/5469274/what-does-plt-mean -here) – DCoder 2014-09-04 13:51:45

+4

它調用'puts()'庫函數來打印文本(代替'printf()' - 因爲你沒有傳入任何參數,這相當於調用更簡單/更快的'puts() ') – 2014-09-04 13:51:51

回答

14

PLT的意思是程序連接表。這是ELF文件中使用的一種特殊技術,用於在裝載相對尋址可用的機器上進行本地化。

您正在調用的函數位於另一個模塊(通常爲libc.so. x)中,因此在程序加載執行時必須提供該函數的實際地址。

PLT本質上是可執行文件(或.so文件)中的一個區域,其中所有未完成的引用都被收集在一起。它們具有目標機器跳轉指令的形式,實際地址仍未填充。這取決於裝載機來填寫地址。這個過程被稱爲修復。

因爲模塊的其餘部分使用相對尋址通過PLT進行函數調用,並且在鏈接時知道PLT的偏移量,所以不需要在那裏進行修正。這意味着您的大部分模塊可能會繼續映射到模塊文件而不是交換文件。

還需要指出的是,對PLT的補充是GOT,Global Offset Table。雖然PLT用於函數調用,但GOT用於數據。

+2

GOT還包含PLT存根使用的外部代碼的實際指針(儘管有時它們被分組在一個單獨的'.plt.got'部分中)。 – 2014-09-04 15:20:47