2010-04-15 25 views
6

Đối với các biến toàn cầu trong C nhưCác biến toàn cục được trình nạp elf khởi tạo như thế nào

int aglobal = 5;

Khi nào bộ chuyển đổi 5 được chuyển vào bộ nạp dữ liệu bởi trình tải và làm thế nào để nó được chuyển thành 5 trong aglobal.

Tình huống tương tự với khai báo tĩnh trong một hàm. Giống như

int afunc() { static int astatic = 8; trở về astatic; }

Trả lời

6

Không gian int được tạo thành trong phần dữ liệu, với giá trị 5 được mã hóa trong đó và biểu tượng phi chức năng toàn cầu có tên 'aglobal' được thêm vào bảng biểu tượng trỏ vào nó. Các tham chiếu đến aglobal được chuyển thành các relocations được giải quyết tại thời điểm liên kết để trỏ đến khối dữ liệu đó, vì vậy trong hướng dẫn hình ảnh được liên kết đầy đủ sẽ tải trực tiếp từ vị trí đó vào bộ nhớ giữ 5 giá trị

Ví dụ: (x86) lắp ráp có thể giống như thế:

.data 
.globl aglobal 
aglobal: .long 5 

.text 
main: 
    mov eax, aglobal 

trong một tập tin đối tượng, hướng dẫn mov sẽ biến thành mov eax, 0 với một di dời R_386_32 aglobal+0, bởi vì tập tin đối tượng không biết chắc chắn nơi phần dữ liệu sẽ được ở ký ức.

Trong một hình ảnh hoàn toàn liên kết, nó có thể là một cái gì đó như:

mov eax, 0x804a010 

Bây giờ địa chỉ thực tế của 4 byte trong phần dữ liệu được biết đến, vì vậy nó chỉ định trực tiếp

+0

cám ơn này giúp. Sửa lỗi nếu tôi sai ... Vì vậy, nếu đọc hoặc viết thành aglobal trong mã của tôi, nó đang truy cập phần .data. Phần .data được khởi tạo bởi trình tải sao chép phần .data từ tệp elf vào bộ nhớ. – newguy

+0

Phải, phần dữ liệu được tải vào bộ nhớ giống như phần văn bản (nhưng nói chung nó không thể thực thi được và văn bản không thể ghi được, để thử và ngăn chặn việc khai thác). Tại thời điểm liên kết, vị trí mà từ cụ thể trong phần dữ liệu sẽ được xác định và tất cả các hướng dẫn tham chiếu đến nó (chúng sẽ có vị trí di chuyển với tên 'aglobal') được cố định lên tới điểm bù đó. Tất cả trình nạp cần làm là dịch chuyển toàn bộ hình ảnh từ địa chỉ cơ sở sang địa chỉ thực sự được tải trong bộ nhớ (rất nhiều ảnh có địa chỉ cơ sở là 0, vì vậy nó chỉ thêm địa chỉ bộ nhớ khởi động) –

+0

Cảm ơn. Tôi đánh giá cao sự giúp đỡ của Mike. – newguy

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