2014-09-04 17 views
7

lúc tôi cố gắng để có được một chút gần gũi hơn với lập trình lắp ráp và do đó nhìn vào mã lắp ráp của một chương trình hello world dễ dàng:Chính xác thì <[email protected]> là gì?

#include <stdio.h> 

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

Bây giờ tôi cố gắng tìm hiểu làm thế nào một fiew lệnh lắp ráp đơn giản làm việc trong khi đi từng bước thông qua các mã lắp ráp và phân tích chính xác những gì sẽ xảy ra:

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 

vấn đề là tôi không thực sự hiểu dòng này:

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

Tôi đã cố gắng nhìn vào địa chỉ 0x400410 theo những cách khác nhau nhưng tôi không thực sự có được nó những gì nó thực sự:/Ngoài ra tôi không biết điều này chính xác có nghĩa là: <[email protected]>

sẽ được thực sự tuyệt vời nếu ai đó có thể giúp tôi hiểu điều này dòng cụ thể :) Lời chào Sleepy

+0

đặt @ plt là một cuộc gọi hàm. http://www.cplusplus.com/reference/cstdio/puts/ – IdeaHat

+4

Xem thêm [@ plt' có nghĩa là gì ở đây?] (https://stackoverflow.com/questions/5469274/what-does-plt-mean -nó) – DCoder

+4

Gọi hàm 'puts()' để in văn bản của bạn (thay cho 'printf()' - vì bạn không truyền bất kỳ tham số nào, nó tương đương với việc gọi đơn giản hơn/nhanh hơn 'puts() ') –

Trả lời

14

PLT có nghĩa là Thủ tục Bảng liên kết. Nó là một kỹ thuật đặc biệt được sử dụng trong các tệp ELF để bản địa hóa việc sửa lỗi tại thời điểm tải trên các máy có sẵn địa chỉ tương đối.

Hàm bạn đang gọi nằm trong mô-đun khác (thường là libc.so. x), do đó địa chỉ thực của hàm phải được cung cấp khi chương trình được tải để thực thi.

PLT cơ bản là một khu vực trong tệp thi hành của bạn (hoặc tệp .so) nơi tất cả các tham chiếu nổi bật được thu thập cùng nhau. Chúng có dạng lệnh nhảy của máy đích với địa chỉ thực tế còn lại không được lấp đầy. Nó được tải lên để điền vào các địa chỉ. Quá trình này được gọi là sửa chữa.

Vì phần còn lại của mô-đun của bạn thực hiện các cuộc gọi hàm qua PLT bằng cách sử dụng địa chỉ tương đối và bù đắp cho PLT được biết tại thời điểm liên kết, không có gì phải được sửa ở đó. Điều này có nghĩa rằng hầu hết các mô-đun của bạn có thể tiếp tục được ánh xạ lên tệp mô-đun thay vì tệp hoán đổi.

Cũng cần lưu ý rằng bổ sung cho PLT là GOT, Bảng bù đắp toàn cầu. Trong khi PLT được sử dụng cho các cuộc gọi hàm, GOT được sử dụng cho dữ liệu.

+2

GOT cũng giữ các con trỏ thực sự cho mã bên ngoài được sử dụng bởi các cuống PLT (mặc dù đôi khi chúng được nhóm lại trong một phần '.plt.got' riêng biệt). –

Các vấn đề liên quan