Sự khác biệt giữa các tệp thư viện .so, .la và .a là gì?


230

Tôi biết một .sotệp là một loại thư viện động (rất nhiều luồng có thể chia sẻ các thư viện đó vì vậy không cần phải có nhiều hơn một bản sao của nó trong bộ nhớ). Nhưng sự khác biệt giữa .avà là .lagì? Có phải tất cả các thư viện tĩnh?

Nếu libs động có lợi thế lớn so với tĩnh, tại sao vẫn còn nhiều thư viện tĩnh?

Tôi cũng muốn biết cơ chế cơ bản để tải các thư viện (cả hai loại) và cách một đoạn mã trong lib được gọi khi nó được sử dụng ở đâu đó. Tôi nên học phần nào của nhân? Và tôi nên biết lệnh / tiện ích liên quan đến Linux nào để biết quy trình đang chạy như thế nào? (Tôi chỉ biết ldlệnh bây giờ)

Khi nào tôi nên cố gắng xây dựng mã thành .sohay .a? Cái nào tốt hơn?

[mirror@home ins_openvpn]$ ls lib/openvpn/plugins/ -l
total 96
-rw-r--r-- 1 mirror mirror 22892 Sep  2 23:25 openvpn-plugin-auth-pam.a
-rwxr-xr-x 1 mirror mirror   931 Sep  2 23:25 openvpn-plugin-auth-pam.la
-rwxr-xr-x 1 mirror mirror 23621 Sep  2 23:25 openvpn-plugin-auth-pam.so
-rw-r--r-- 1 mirror mirror 17228 Sep  2 23:25 openvpn-plugin-down-root.a
-rwxr-xr-x 1 mirror mirror   932 Sep  2 23:25 openvpn-plugin-down-root.la
-rwxr-xr-x 1 mirror mirror 18805 Sep  2 23:25 openvpn-plugin-down-root.so

Câu trả lời:


306

.sotập tin là thư viện động . Hậu tố là viết tắt của "đối tượng chia sẻ", bởi vì tất cả các ứng dụng được liên kết với thư viện sử dụng cùng một tệp, thay vì tạo một bản sao trong kết quả thực thi.

.atập tin là thư viện tĩnh . Hậu tố là viết tắt của "archive", bởi vì chúng thực sự chỉ là một kho lưu trữ (được tạo bằng arlệnh - tiền thân của tarcái mà bây giờ chỉ được sử dụng để tạo thư viện) của các tệp đối tượng .o ban đầu.

.lacác tệp là các tệp văn bản được sử dụng bởi gói "libtools" của GNU để mô tả các tệp tạo nên thư viện tương ứng. Bạn có thể tìm thêm thông tin về họ trong câu hỏi này: Tệp .la của libtool để làm gì?

Mỗi thư viện tĩnh và động đều có ưu và nhược điểm.

Tĩnh pro: Người dùng luôn sử dụng phiên bản của thư viện mà bạn đã thử nghiệm với ứng dụng của mình, do đó không nên có bất kỳ vấn đề tương thích đáng ngạc nhiên nào.

Con tĩnh: Nếu một vấn đề được khắc phục trong thư viện, bạn cần phân phối lại ứng dụng của mình để tận dụng lợi thế của nó. Tuy nhiên, trừ khi đó là thư viện mà người dùng có thể tự cập nhật, bạn có thể cần phải thực hiện việc này bằng mọi cách.

Dynamic pro: Dấu chân bộ nhớ của quy trình của bạn nhỏ hơn, vì bộ nhớ được sử dụng cho thư viện được khấu hao trong số tất cả các quy trình sử dụng thư viện.

Dynamic pro: Thư viện có thể được tải theo yêu cầu trong thời gian chạy; điều này tốt cho các plugin, vì vậy bạn không phải chọn các plugin sẽ được sử dụng khi biên dịch và cài đặt phần mềm. Các plugin mới có thể được thêm vào khi đang bay.

Dynamic con: Thư viện có thể không tồn tại trên hệ thống nơi ai đó đang cố cài đặt ứng dụng hoặc họ có thể có phiên bản không tương thích với ứng dụng. Để giảm thiểu điều này, gói ứng dụng có thể cần bao gồm một bản sao của thư viện, vì vậy nó có thể cài đặt nó nếu cần thiết. Điều này cũng thường được giảm nhẹ bởi các nhà quản lý gói, có thể tải xuống và cài đặt bất kỳ phụ thuộc cần thiết nào.

Thư viện động đặc biệt hữu ích cho các thư viện hệ thống, như libc. Các thư viện này thường cần bao gồm mã phụ thuộc vào hệ điều hành và phiên bản cụ thể, vì các giao diện kernel đã thay đổi. Nếu bạn liên kết một chương trình với thư viện hệ thống tĩnh, nó sẽ chỉ chạy trên phiên bản HĐH mà phiên bản thư viện này được viết cho. Nhưng nếu bạn sử dụng thư viện động, nó sẽ tự động chọn thư viện được cài đặt trên hệ thống bạn chạy.


1
@Barmar, Vì vậy, bạn đang nói rằng những lợi thế của thư viện tĩnh lớn hơn những lợi thế của thư viện động?
Pacerier

4
@Pacerier Tôi không biết bạn lấy nó từ đâu.
Barmar

13
Đó là một câu hỏi vô nghĩa. Trọng lượng của ưu và nhược điểm phụ thuộc vào hoàn cảnh, không có câu trả lời chung. Có vẻ như bạn có một chương trình nghị sự, và bạn đang cố gắng mồi chài tôi.
Barmar

3
@Barmar, Nop tôi vô tội. Chỉ là một kẻ tò mò.
Pacerier

11
Một yếu tố khác là cấp phép - LGPL yêu cầu liên kết động trong bối cảnh thương mại, tức là nơi bạn không muốn phân phối nguồn của mình.
Sam
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.