2008-12-03 19 views

Trả lời

7

Bạn đang tìm mức chi tiết nào? Ở cấp độ cơ bản, tất cả các liên kết động hoạt động khá giống nhau:

  1. Thư viện động được biên dịch thành mã có thể định vị lại (sử dụng nhảy tương đối thay vì tuyệt đối chẳng hạn).
  2. Trình liên kết tìm thấy một không gian trống có kích thước phù hợp trong bản đồ bộ nhớ của ứng dụng và đọc mã của tệp DLL và bất kỳ dữ liệu tĩnh nào vào không gian đó.
  3. Thư viện động có chứa bảng bù để bắt đầu mỗi hàm đã xuất và cuộc gọi đến hàm DLL trong chương trình máy khách được vá tại thời gian tải với địa chỉ đích mới, dựa vào nơi thư viện được tải.
  4. Hầu hết các hệ thống liên kết động có một số hệ thống để đặt địa chỉ cơ sở ưu tiên cho một thư viện cụ thể. Nếu một thư viện được tải tại địa chỉ ưa thích của nó, thì việc di chuyển trong các bước 2 và 3 có thể được bỏ qua.
+0

@Mark Bessey. ở cấp độ máy :). Làm thế nào bộ nạp làm phép thuật đó. Tôi thích phân định của bạn và tôi sẽ đánh giá cao nếu bạn có thể cung cấp liên kết/ví dụ về mã m/c đã giải mã hoặc mã asm để giải thích bit. Hãy dành thời gian của bạn KHÔNG vội vàng. :) – mahesh

2

Giả sử đây là trong Windows (DLL gợi ý tại đó), bạn có thể muốn đọc trang tài liệu Run-Time Dynamic Linking của Microsoft. Nó không chỉ rõ chi tiết cách DLL được ánh xạ vào không gian địa chỉ; Tôi đoán bạn không cần phải biết điều đó.

+0

thư giãn, tôi đã chỉ định rằng 'tôi tò mò muốn biết'. chỉ tò mò @ m/c level :). Cảm ơn bạn đã liên kết. – mahesh

3

Nếu bạn thực sự quan tâm, bạn nên đọc cuốn sách Linkers and Loaders.

+0

Cảm ơn bạn D & C về Liên kết tốt nhất đó. – mahesh

9

OK, tôi giả định phía Windows của mọi thứ ở đây. Điều gì sẽ xảy ra khi bạn tải một tệp PE là trình tải (chứa trong NTDLL) sẽ làm như sau:

  1. Định vị từng tệp DLL sử dụng ngữ nghĩa tìm kiếm DLL (hệ thống và mức bản vá), nổi tiếng Các tệp DLL được miễn loại này
  2. Ánh xạ tệp vào bộ nhớ (MMF), trong đó các trang được sao chép (COW)
  3. Chuyển thư mục nhập và mỗi lần bắt đầu nhập (đệ quy) tại điểm 1.
  4. Giải quyết các chuyển vị, phần lớn thời gian chỉ là một số lượng thực thể rất hạn chế, vì chính mã đó là mã độc lập vị trí (PIC)
  5. (IIRC) vá EAT từ RVA (địa chỉ ảo tương đối) sang VA (địa chỉ ảo trong không gian bộ nhớ hiện tại)
  6. Vá IAT (bảng địa chỉ nhập) để tham chiếu nhập bằng địa chỉ thực của chúng trong không gian bộ nhớ quá trình
  7. đối với một cuộc gọi DLL DLLMain() cho một EXE tạo ra một chủ đề mà bắt đầu địa chỉ là điểm mấu chốt của file PE (điều này cũng là quá đơn giản hóa, vì địa chỉ bắt đầu thực tế là bên trong kernel32.dll cho quá trình Win32)

Bây giờ khi bạn biên dịch mã, nó phụ thuộc vào trình liên kết cách hàm bên ngoài được tham chiếu. Một số mối liên kết tạo ra các nhánh để - theo lý thuyết - cố gắng kiểm tra địa chỉ hàm chống lại NULL sẽ luôn luôn nói rằng nó không phải là NULL. Đó là một quirk bạn phải nhận thức được nếu và khi mối liên kết của bạn bị ảnh hưởng.Những người khác tham chiếu trực tiếp vào IAT trong trường hợp hàm unreferenced (nghĩ rằng delay-loaded DLLs) có thể là NULL và trình xử lý SEH sẽ gọi trình trợ giúp tải trễ và (cố gắng) giải quyết địa chỉ hàm, trước khi tiếp tục thực hiện tại điểm nó thất bại.

Có rất nhiều băng đỏ liên quan đến quy trình trên mà tôi đã đơn giản hóa.

Ý chính cho những gì bạn muốn biết là ánh xạ vào quá trình diễn ra dưới dạng MMF, mặc dù bạn có thể bắt chước hành vi bằng không gian vùng heap. Tuy nhiên, nếu bạn nhớ điểm về CoW, đó là mấu chốt trong ý tưởng của các tệp DLL. Trên thực tế, cùng bản sao (hầu hết) các trang của DLL sẽ được chia sẻ giữa các quá trình tải một DLL hạt. Các trang không được chia sẻ là những trang mà chúng tôi đã viết, ví dụ như khi giải quyết việc di chuyển và những thứ tương tự. Trong trường hợp này, mỗi quá trình có một bản sao của trang gốc.

Và một lời cảnh báo liên quan đến nhà đóng gói EXE trên DLL. Chúng đánh bại chính xác cơ chế CoW mà tôi đã mô tả ở chỗ chúng phân bổ không gian cho các nội dung được giải nén của DLL trên đống quá trình mà DLL được nạp. Vì vậy, trong khi nội dung tập tin thực tế vẫn được ánh xạ dưới dạng MMF và được chia sẻ, nội dung giải nén chiếm cùng một lượng bộ nhớ cho mỗi quá trình tải DLL thay vì chia sẻ.

+0

Giải thích tuyệt vời về các thuộc tính CoW của các tệp DLL. – shebaw

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