2009-06-20 12 views

Trả lời

10

Có, bạn cần thư viện tĩnh để xây dựng tệp thực thi được liên kết tĩnh.

Thư viện tĩnh là các gói đối tượng được biên dịch. Khi bạn liên kết tĩnh với thư viện, nó có hiệu quả giống như lấy kết quả biên dịch của thư viện đó, giải nén chúng trong dự án hiện tại của bạn và sử dụng chúng như thể chúng là đối tượng của riêng bạn.

Thư viện động đã được liên kết. Điều này có nghĩa là một số thông tin như việc định vị lại đã được sửa và loại bỏ.

Ngoài ra, thư viện động phải được biên dịch dưới dạng mã độc lập vị trí. Đây không phải là hạn chế đối với các thư viện tĩnh và dẫn đến sự khác biệt đáng kể về hiệu suất trên một số nền tảng phổ biến (như x86).

Có các công cụ như ELF Statifier cố gắng gộp các thư viện được liên kết động vào tệp thực thi được liên kết động, nhưng rất khó để tạo ra kết quả chính xác trong mọi hoàn cảnh.

+1

Cảm ơn bạn đã có câu trả lời tuyệt vời. Nhưng tại sao nó lại khó thế? –

+2

ELF Statfier tải tệp thực thi và tất cả thư viện của nó, sau đó chụp nhanh bộ nhớ quy trình. Khi hình ảnh đầu ra được chạy, mọi thứ sẽ khiến bố cục bộ nhớ thay đổi (ví dụ: VDSO ngẫu nhiên) sẽ dẫn đến hoạt động không chính xác. Bất kỳ cách tiếp cận khác đòi hỏi phải tái phát minh ra mối liên kết động. – ephemient

+1

Tại sao lại khó thực hiện lại trình liên kết động? Không phải chỉ có hai bảng nhập khẩu và xuất khẩu của thư viện, phải được di dời? Đó là trình liên kết, vì vậy nó đã triển khai một trình liên kết tĩnh và nó biết định dạng tệp của tệp thực thi và của thư viện động, v.v. – ChrisW

6

Không có thứ gì như biên dịch tĩnh, chỉ liên kết tĩnh. Và cho rằng, bạn cần thư viện tĩnh. Sự khác biệt giữa liên kết tĩnh và động là với tên cũ, tên được giải quyết tại thời gian liên kết (chỉ sau thời gian biên dịch), wheras với thứ hai, chúng được giải quyết giống như chương trình bắt đầu chạy.

Thư viện tĩnh và động có thể chứa hoặc không chứa cùng thông tin, tùy thuộc vào nhiều yếu tố. Quyết định về việc liên kết tĩnh hoặc động của bạn có phải là mã quan trọng hay không và thường ảnh hưởng đến kiến ​​trúc ứng dụng.

+0

Cảm ơn, đã sửa 'biên dịch' thành 'liên kết'. –

2

Tất cả thư viện bạn liên kết vào chương trình được liên kết tĩnh phải là biến thể tĩnh. Mặc dù thư viện động (libfoo.so) và tĩnh (libfoo.a) có cùng chức năng trong chúng, chúng là các tệp định dạng khác nhau và vì vậy bạn cần loại đối sánh cho chương trình của mình.

1

Một tùy chọn khác là Ermine (http://magicErmine.com) Giống như trình thống kê, nhưng có thể xử lý ngẫu nhiên bộ nhớ.

+0

Sản phẩm tuyệt vời, cảm ơn bạn. –