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
Nguồn
2010-04-15 22:18:26
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
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) –
Cảm ơn. Tôi đánh giá cao sự giúp đỡ của Mike. – newguy