2013-05-05 41 views
9

Tôi mới tham gia hội thảo và do đó muốn hiểu thêm về khái niệm di dời.Khái niệm di dời có nghĩa là gì?

  1. Tại sao chính xác chúng tôi cần phải di chuyển chương trình, dữ liệu?
  2. Chính xác như thế nào?

Sẽ thật tuyệt nếu ai đó có thể giải thích bằng ví dụ cấp độ mới bắt đầu.

+0

http://stackoverflow.com/questions/6002359/so-most-of-the-binary-is-composed-of-reloc-table/6092773#6092773 – JosephH

+0

Vấn đề lập trình thực tế của bạn là gì? Chương trình của bạn có chạy không vì vấn đề với việc di chuyển? –

+0

Ví dụ chi tiết tối thiểu: http://stackoverflow.com/a/30507725/895245 –

Trả lời

12

Bộ kết hợp có một tệp nguồn để xem. Nó phải xây dựng một hình ảnh bộ nhớ dựa trên một tệp nguồn đó. Vì vậy, nó bắt đầu với 0 cho mã, và cũng cho 0 với dữ liệu. Các kết quả đi vào một tập tin đối tượng.

Bây giờ, trình liên kết đến và cần kết hợp nhiều tệp đối tượng vào tệp thực thi (hoặc hình ảnh hạt nhân hoặc bất kỳ thứ gì). Nó không thể để mọi người ở 0, họ sẽ chồng lên nhau. Vì vậy, nó phải thay đổi địa chỉ để gán giá trị dữ liệu của từng tệp đối tượng cho một phạm vi duy nhất.

Sau đó, sau đó hình ảnh được tải vào bộ nhớ ảo, hệ điều hành có thể có lý do tốt để muốn sử dụng một địa chỉ khác với '0' làm địa chỉ ảo cơ sở. Vì vậy, vào thời gian chạy, nó muốn di chuyển tất cả mọi thứ một lần nữa.

Cuối cùng, nếu có thư viện được chia sẻ liên quan, không phải người lắp ráp cũng như người liên kết biết họ sẽ ở đâu trong môi trường đang chạy và do đó các tham chiếu đến chúng phải được di chuyển.

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