2013-07-27 20 views
5

Các bước nào được thực hiện bởi trình liên kết trong khi giải quyết việc di chuyển trong một tệp đối tượng trước khi tạo hình ảnh cuối cùng? Cụ thể hơn, trình liên kết xử lý giá trị đã được lưu trữ tại vị trí di chuyển như thế nào? Liệu nó có luôn thêm nó vào VA/RVA cuối cùng hay đôi khi nó bị bỏ qua (ví dụ: một số loại di dời nhất định)?Làm cách nào để di chuyển hoạt động trong các tệp COFF đối tượng (không phải hình ảnh)

tôi không thể tìm thấy một lời giải thích rõ ràng trong MS PE/COFF Specfication, và sau khi googling và thử nghiệm một thời gian, tất cả tôi có thể tìm hiểu được điều này:

  1. Trong spec MS COFF, chương 5.6.2 " Các kiểu tái định vị cơ sở ", người ta nói rằng" Việc di dời cơ sở áp dụng tất cả 32 bit của sự khác biệt cho trường 32 bit ở mức bù ", mà tôi đoán có nghĩa là việc di dời phải tính đến bất kỳ địa chỉ nào đã được lưu trữ . Tuy nhiên, chương 5.6 (phần .reloc) chỉ liên quan đến các tệp hình ảnh chứ không phải tệp đối tượng.
  2. Tiện ích dumpbin thêm cột có tên "Áp dụng cho" khi in bảng di chuyển, dường như luôn luôn (không có vấn đề loại di dời) chứa giá trị được lưu trữ tại vị trí di dời.
  3. Relocation Directives chapter in the DJGPP COFF Specification tuyên bố rõ ràng rằng giá trị hiện được lưu trữ tại vị trí phải được thêm vào địa chỉ của biểu tượng được chỉ định bởi mục nhập bảng di chuyển.

Bạn có thể chỉ cho tôi bất kỳ tài liệu nào (có liên quan) giải thích cách liên kết được xử lý bởi trình liên kết không?

+0

Không phải là phần thích hợp cho tệp đối tượng 4.2 "Chuyển vị trí COFF" và không phải phần 5.6.2 chỉ dành cho tệp hình ảnh? – legalize

+0

Phải, nhưng phần 4.2 không giải thích phải làm gì nếu trang web di dời có giá trị khác 0 được lưu trữ trong đó, điều này thực sự khá phổ biến và có thể dễ dàng nhìn thấy bằng cách sử dụng dumpbin. – user2625389

Trả lời

5

Phần di chuyển được sử dụng trong "tệp hình ảnh" có mục đích hơi khác so với thông tin di chuyển có trong "tệp đối tượng".

Không giống như thư viện chia sẻ Linux, Windows DLL không thường sử dụng mã vị trí độc lập. Thay vào đó chúng được định nghĩa tương đối với một địa chỉ cố định. Trình tải Windows, tuy nhiên, có khả năng di chuyển một DLL trong trường hợp có xung đột. Để hỗ trợ điều này, các hình ảnh DLL chứa các phần di chuyển xác định dữ liệu nào cần được sửa đổi khi hình ảnh được di chuyển. Nhiều tham chiếu biểu tượng trong dll sẽ sử dụng địa chỉ tương đối "eip" (hoặc trích xuất), vì vậy chúng có thể không cần phải sửa đổi khi di chuyển DLL.

Việc di chuyển tệp hình ảnh luôn được chỉ định liên quan đến địa chỉ cơ sở của hình ảnh thực thi. Việc di chuyển tệp đối tượng được chỉ định tương đối so với địa chỉ (trong một hình ảnh, sử dụng địa chỉ dựa trên hình ảnh ưa thích) của một biểu tượng trong một bảng biểu tượng. Tệp hình ảnh không có bảng biểu tượng (chúng có IAT, nhưng đó không phải là bảng biểu tượng). Tập hợp các vị trí được hỗ trợ trong tệp đối tượng phong phú hơn tập hợp được hỗ trợ trong tệp hình ảnh.

Chi tiết được đề cập trong phần "COFF Relocations (Object Only)" của thông số PE/COFF (Tôi đang xem phiên bản 3 khi tôi nhập này).

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