2010-01-13 37 views

Trả lời

17

liên kết tải thời gian là khi biểu tượng trong thư viện, được tham chiếu bởi tệp thực thi (hoặc thư viện khác) được xử lý khi thư viện/thư viện thực thi được tải vào bộ nhớ.

Liên kết thời gian chạy là khi bạn sử dụng API được hệ điều hành cung cấp hoặc thông qua thư viện để tải DLL hoặc DSO khi bạn cần và thực hiện độ phân giải biểu tượng sau đó.

Tôi biết nhiều hơn về DSO Linux hơn Windows DLL nhưng nguyên tắc phải giống nhau. Các thư viện .NET có thể khác nhau.

Trong linux, kiến ​​trúc plugin được thực hiện theo cách này. Chương trình của bạn sẽ sử dụng thời gian chạy liên kết để tải lên một thư viện và gọi một số chức năng. Sau đó, có thể dỡ bỏ nó. Nó cũng cho phép nhiều thư viện có cùng biểu tượng được xuất để tải mà không bị xung đột. Tôi nghĩ rằng các tệp DLL sẽ hoạt động theo cách tương tự.

Các tệp thi hành có "khoảng trắng" trong bảng biểu tượng cần được một thư viện điền. Những khoảng trắng này thường được điền vào lúc tải, hoặc thời gian biên dịch. Bạn có thể phủ nhận sự cần thiết của "khoảng trống" trong bảng biểu tượng bằng cách sử dụng liên kết thời gian chạy.

Một trường hợp khác khi liên kết thời gian chạy hữu ích là để gỡ lỗi các thư viện hoặc chọn từ nhiều thư viện tương thích ABI/API khi chạy. Tôi thường có một thư viện, nói "foo" và được gọi là "foo_unstable" và có một ứng dụng thử nghiệm chuyển đổi giữa 2 và thực hiện một số thử nghiệm.

Dưới Linux, để xem những gì thư viện một liên kết thực thi để vào tải khi bạn chạy lệnh ldd và nhận được kết quả như (on/bin/ls):

linux-vdso.so.1 => (0x00007fff139ff000) 
librt.so.1 => /lib64/librt.so.1 (0x0000003c4f200000) 
libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003c4fa00000) 
libcap.so.2 => /lib64/libcap.so.2 (0x0000003c53a00000) 
libacl.so.1 => /lib64/libacl.so.1 (0x0000003c58e0000 

Hệ điều hành sẽ cố gắng tải các thư viện (các tệp .so) tại thời gian tải. Nó có thể đã có thư viện trong bộ nhớ.

14

Aiden Bell phủ nguyên tắc cơ bản, nhưng tôi sẽ thêm:

Thời gian tải liên kết động thường được thực hiện bằng cách liên kết tĩnh ứng dụng của bạn để một .lib hoặc .a tập tin có chứa mã để tự động thiết lập các liên kết thời gian chạy đến biểu tượng để được tìm thấy trong các tệp .dll hoặc .so khi khởi động chương trình. Điều này thường dành cho chức năng cố định (tức là thư viện thời gian chạy C, v.v.) và cho phép chương trình của bạn gặt hái những lợi ích của việc sửa lỗi trong thư viện trong khi vẫn giữ kích thước thực thi nhỏ (bằng cách sử dụng mã chung vào một thư viện).

Liên kết thời gian chạy được sử dụng cho nhiều chức năng động hơn như tải plugin. Như Aiden đã nói, bạn sử dụng LoadLibrary() hoặc tương đương với việc tích cực đính kèm các mô-đun vào chương trình của bạn trong thời gian chạy, có thể bằng cách thẩm vấn một thư mục chứa plugin DLL, tải từng câu một và nói chuyện với nó bằng API plugin trong nhà. Bằng cách đó, chương trình của bạn có thể tải các mô-đun thậm chí không tồn tại khi ứng dụng của bạn được biên dịch/liên kết và do đó có thể phát triển hữu cơ sau khi triển khai.

Về cơ bản, cả hai phương pháp đều kết thúc việc gọi API LoadLibrary(), nhưng sử dụng bộ ký hiệu và thư viện cố định trong trường hợp trước và bộ động hơn trong trường hợp sau.

+2

+1 cho lợi ích phát triển/tăng trưởng. Kiến trúc mô-đun rất hay. –

+2

Thông tin bổ sung cho tệp thực thi .Net: Chúng sử dụng liên kết động thời gian chạy. Nếu bạn mở .Net DLLs trong "Dependency Walker", bạn có thể thấy chúng chỉ tải thời gian liên kết động với MSCOREE.DLL. Thông tin thêm liên quan đến điều này là ở đây: http://stackoverflow.com/questions/9545603/is-mscorlib-dll-mscoree-dll-loaded-when-net-application-runs Nếu bạn tham khảo nhưng không sử dụng một DLL và DLL bị thiếu thì ứng dụng của bạn sẽ không bị lỗi. Bạn có thể thấy các DLL hiện đang được nạp trong Debug> Windows> Modules. –

9

Đã lâu rồi câu hỏi được hỏi. Và câu trả lời của Aiden và Drew đã trình bày phần lớn bản chất.Tôi chỉ muốn thêm một vài điều từ quan điểm của lập trình viên.

Nếu bạn sử dụng Liên kết động tải thời gian, chúng tôi phải liên kết với tệp LIB. Và sau đó trong mã, chúng ta có thể gọi phương thức này một cách rõ ràng như bình thường. (Xem Using Load-Time Dynamic Linking cho mẫu mã)

Nếu bạn sử dụng Run-Time Dynamic Linking, bạn phải quản lý tải/giải phóng DLL và tự tra cứu chức năng. (Xem Using Run-Time Dynamic Linking cho mẫu mã)

Để lựa chọn giữa 2 tùy chọn, hãy kiểm tra Determining Which Linking Method to Use.

Vì vậy, tôi nghĩ rằng Liên kết động tải thời gian chỉ là một cách khác để lưu nỗ lực của người lập trình. Nhưng nó đến với giá của một số khả năng mở rộng. Bạn chỉ có thể sử dụng tệp DLL tương ứng với các tệp LIB mà bạn sử dụng làm thư viện nhập.

Về cơ bản, cả hai cách tiếp cận liên kết đều sử dụng API LoadLibrary() trên nền tảng Windows.

0

Trong thời gian tải liên kết động thực thi được liên kết với thư viện DLL trong khi trong thời gian chạy động liên kết không thực thi được liên kết o bất kỳ DLL.

Liên kết động thời gian chạy là thích hợp hơn khi hiệu suất khởi động của ứng dụng là quan trọng

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