ranlib là gì?


13

Tôi đã sử dụng một hệ thống MacOSX được một thời gian, nhưng chỉ gần đây mới bắt đầu chọc vào ruột. Tôi tìm thấy một hướng dẫn bảo tôi chạy 'sudo ranlib /usr/local/lib/libjpeg.a'(installing libjpeg). Tôi đã đọc hướng dẫn sử dụng ranlib và thử tìm kiếm trực tuyến trên đó. Tôi chỉ đơn giản là không hiểu. Những tài nguyên nào tôi cần tìm kiếm để tìm hiểu thêm hoặc ai đó có thể đưa ra lời giải thích ngắn gọn về việc sử dụng nó? Cảm ơn trước!

Câu trả lời:


7

ranlibthêm hoặc cập nhật các tệp đối tượng trong một thư viện tĩnh . Trình liên kết có thể sử dụng các thư viện tĩnh khi liên kết để cung cấp các ký hiệu mà mã cần để hoạt động (trái ngược với trình tải tìm kiếm chúng trong các thư viện động khi chạy tệp thực thi).


Xin chào Ignacio, cảm ơn bạn đã phản hồi. Điều này có nghĩa là nếu tôi thực thi ranlib trên thư viện, nó sẽ có sẵn để sử dụng mỗi khi một trình liên kết cố gắng 'tham chiếu' nó? Làm thế nào nó được gỡ bỏ?
Ying

ranlibđược sử dụng để tạo và sửa đổi các thư viện. Tùy thuộc vào trình liên kết để sử dụng chúng, thường bằng cách chuyển vị trí thư viện và / hoặc tên trên dòng lệnh. Xem -L-lđối số để gcc để biết chi tiết.
Ignacio Vazquez-Abrams

5
Nhưng cũng không arlàm điều đó? Có gì khác biệt?
Greatwolf

18

Mô tả này có vẻ khá rõ ràng: http://sourceware.org/binutils/docs/binutils/ranlib.html

Vì vậy, nếu bạn lưu trữ một tập hợp các tệp đối tượng, hãy nói:

$ ar r fruits.a apple.o orange.o pineapple.o

Sau đó chạy

$ ranlib fruits.a

tạo một chỉ mục của nội dung của fruit.a và lưu trữ chỉ mục trong Fruits.a. Điều này rất hữu ích để liên kết và trong trường hợp các đối tượng gọi nhau.


"ranlib tạo một chỉ mục cho nội dung của một kho lưu trữ và lưu trữ nó trong kho lưu trữ". Điều này nghe có vẻ giống như một cái gì đó được kết hợp với tarvà tôi sẽ nói không rõ ràng lắm.
Codebling

9

ranlib tạo một chỉ mục cho nội dung của một kho lưu trữ và lưu trữ nó trong kho lưu trữ. Chỉ mục liệt kê từng ký hiệu được xác định bởi một thành viên của kho lưu trữ là tệp đối tượng có thể định vị lại. Một kho lưu trữ với chỉ mục như vậy tăng tốc liên kết đến thư viện và cho phép các thói quen trong thư viện gọi nhau mà không liên quan đến vị trí của chúng trong kho lưu trữ.

nguồn: trang người đàn ông ranlib


2

ar

Trong Linux, arlà trình lưu trữ mục đích chung GNU. (Có các biến thể không phải GNU artrong các HĐH giống Unix khác). Với tùy chọnc

ar c... archive-name file...

Nó tạo ra một kho lưu trữ chứa các bản sao của file.... Các archive-namequy ước nhưng không nhất thiết phải có phần mở rộng .a(để lưu trữ ). Mỗi loại file...có thể là bất kỳ loại tệp nào, không nhất thiết phải là tệp đối tượng.

Khi các tệp lưu trữ là tất cả các tệp đối tượng, thường là ý định sử dụng kho lưu trữ để phân phối lựa chọn tệp đối tượng đó vào liên kết của các chương trình hoặc DSO (Đối tượng chia sẻ động). Trong trường hợp archive-namenày, thông thường cũng sẽ được cung cấp tiền tố lib, ví dụ libfoo.a, để nó có thể được phát hiện dưới dạng tệp đầu vào của trình liên kết ứng cử viên thông qua tùy chọn liên kết -lfoo.

Được sử dụng như một tệp đầu vào liên kết, libfoo.athường được gọi là thư viện tĩnh . Việc sử dụng này là một nguồn gây nhầm lẫn vĩnh viễn cho các lập trình viên thiếu kinh nghiệm, bởi vì điều đó khiến họ nghĩ rằng một kho lưu trữ libfoo.agiống như một DSO libfoo.so, thường được gọi là thư viện động / chia sẻ và để xây dựng những kỳ vọng sai lầm trên cơ sở này. Trong thực tế, một "thư viện tĩnh" và "thư viện động" hoàn toàn không phải là những thứ tương tự và được sử dụng trong liên kết theo những cách hoàn toàn khác nhau.

Một sự khác biệt dễ thấy là một thư viện tĩnh không được tạo bởi trình liên kết , mà bởi ar. Vì vậy, không có liên kết xảy ra, không có giải pháp biểu tượng xảy ra. Các tệp đối tượng lưu trữ không thay đổi: chúng chỉ được đặt trong một cái túi.

Khi một kho lưu trữ được nhập vào trong liên kết của một thứ được tạo bởi trình liên kết - chẳng hạn như chương trình hoặc DSO - trình liên kết sẽ tìm trong túi để xem liệu có bất kỳ tệp đối tượng nào trong đó cung cấp định nghĩa cho các tham chiếu ký hiệu chưa được giải quyết đã tích lũy sớm hơn trong liên kết. Nếu tìm thấy bất kỳ, nó trích xuất các tệp đối tượng đó từ túi và liên kết chúng vào tệp đầu ra, chính xác như thể chúng được đặt tên riêng lẻ trong dòng lệnh liên kết và lưu trữ hoàn toàn không được đề cập. Vì vậy, toàn bộ vai trò của một kho lưu trữ trong liên kết là một túi các tệp đối tượng mà từ đó trình liên kết có thể chọn những tệp mà nó cần để thực hiện liên kết.

Theo mặc định, GNU arlàm cho kho lưu trữ đầu ra của nó sẵn sàng để sử dụng làm đầu vào liên kết. Nó thêm một "tệp" giả mạo vào kho lưu trữ, với tên tệp ma thuật giả mạo và trong tệp giả mạo này ghi nội dung mà trình liên kết có thể đọc dưới dạng bảng tra cứu từ các ký hiệu toàn cầu được xác định bởi bất kỳ tệp đối tượng nào trong kho lưu trữ đến tên và vị trí của các tệp đối tượng trong kho lưu trữ. Bảng tra cứu này là thứ cho phép trình liên kết tìm trong kho lưu trữ và xác định bất kỳ tệp đối tượng nào xác định bất kỳ tham chiếu ký hiệu nào chưa được giải quyết mà nó có trong tay.

Bạn có thể ngăn chặn việc tạo hoặc cập nhật bảng tra cứu này bằng tùy chọn q(= quick ) - trong thực tế bạn đã sử dụng trong arví dụ của riêng mình - và cả với tùy chọn (viết hoa) S(= không có bảng biểu tượng ). Và nếu bạn gọi arđể tạo hoặc cập nhật một kho lưu trữ chưa có (biểu tượng cải tiến) vì bất kỳ lý do gì, thì bạn có thể cung cấp cho nó một stùy chọn.

runlib

ranlibhoàn toàn không tạo thư viện. Trong Linux, ranliblà một chương trình kế thừa có thêm bảng biểu tượng (nâng cấp) vào arkho lưu trữ nếu nó không có. Hiệu ứng của nó hoàn toàn giống ar svới GNU ar. Trong lịch sử, trước đây arđược trang bị để tạo một bảng biểu tượng, ranliblà loại bùn đã đưa tệp giả mạo ma thuật vào một kho lưu trữ để cho phép trình liên kết chọn các tệp đối tượng từ đó. Trong các HĐH không giống GNU Unix, ranlibvẫn có thể cần thiết cho mục đích này. Ví dụ của bạn:

ar qc libgraphics.a *.o
ranlib libgraphics.a

nói:

  • Tạo libgraphics.abằng cách nối thêm vào một kho lưu trữ tất cả *.ocác tệp trong thư mục hiện tại, không có bảng ký hiệu.
  • Sau đó thêm một bảng biểu tượng để libgraphics.a

Trong linux, điều này có hiệu ứng mạng tương tự như:

ar cr libgraphics.a *.o

Chính nó, ar qc libgraphics.a *.otạo ra một kho lưu trữ mà trình liên kết không thể sử dụng, vì nó không có bảng biểu tượng.

ld

Ví dụ của bạn:

ld -r -o libgraphics.a *.o

thực sự là khá không chính thống. Điều này minh họa việc sử dụng khá hiếm hoi của mối liên kết , ldđể tạo ra một sáp nhập tập tin đối tượng bằng cách liên kết nhiều tập tin đầu vào thành một tập tin đối tượng đầu ra duy nhất, trong đó độ phân giải biểu tượng đã được thực hiện như xa càng tốt , cho các tập tin đầu vào. Các -r(= relocatable ) tùy chọn chỉ đạo các mối liên kết để tạo ra một mục tiêu tập tin đối tượng (chứ không phải là một chương trình, hoặc DSO) bằng cách liên kết các đầu vào càng nhiều càng tốt và không để thất bại các linkaqe nếu tài liệu tham khảo biểu tượng không xác định vẫn còn trong file đầu ra. Việc sử dụng này được gọi là liên kết một phần .

Tệp đầu ra của ld -r ... là một tệp đối tượng, không phải là ar tệp lưu trữ và chỉ định tên tệp đầu ra trông giống như artệp lưu trữ không tạo thành tệp đó. Vì vậy, ví dụ của bạn minh họa một sự lừa dối. Điều này:

ld -r -o graphics.o *.o

sẽ là sự thật Tôi không rõ mục đích của một sự lừa dối như vậy có thể là gì, bởi vì ngay cả khi một tệp đối tượng ELF được gọi libgraphics.avà được nhập vào một liên kết bằng tên đó hoặc bởi -lgraphics, trình liên kết sẽ xác định chính xác đó là tệp đối tượng ELF , không phải là một arkho lưu trữ, và sẽ tiêu thụ nó theo cách nó tiêu thụ bất kỳ tệp đối tượng nào trong dòng lệnh: nó liên kết nó vô điều kiện vào tệp đầu ra, trong khi điểm nhập vào một kho lưu trữ chính hãng là chỉ liên kết các thành viên lưu trữ với điều kiện chúng được tham chiếu . Có lẽ bạn chỉ có một ví dụ về liên kết không sáng suốt ở đây.

Kết thúc ...

Chúng tôi thực sự chỉ thấy một cách sản xuất một cái gì đó được gọi là thư viện thông thường , và đó là sản xuất một cái gọi là thư viện tĩnh , bằng cách lưu trữ một số tệp đối tượng và đặt bảng biểu tượng vào kho lưu trữ.

Và chúng tôi chưa từng thấy cách sản xuất một loại thứ quan trọng và quan trọng nhất khác thường được gọi là thư viện , cụ thể là Đối tượng chia sẻ động / thư viện chia sẻ / thư viện động.

Giống như một chương trình, DSO được tạo bởi trình liên kết . Một chương trình và DSO là các biến thể của nhị phân ELF mà trình tải hệ điều hành hiểu và có thể sử dụng để lắp ráp một quy trình đang chạy. Thông thường chúng ta gọi mối liên kết thông qua một một trong những frontend GCC ( gcc, g++, gfortran, vv):

Liên kết một chương trình:

gcc -o prog file.o ... -Ldir ... -lfoo ...

Liên kết DSO:

gcc -shared -o libbar.so file.o ... -Ldir ... -lfoo ...

Cả thư viện dùng chung và thư viện tĩnh đều có thể được cung cấp cho trình liên kết bằng -lfoogiao thức thống nhất , khi bạn đang liên kết một số chương trình hoặc DSO khác. Tùy chọn đó chỉ đạo trình liên kết quét các chỉ thị tìm kiếm được chỉ định hoặc mặc định của nó để tìm libfoo.sohoặc libfoo.a. Theo mặc định, một khi tìm thấy một trong số chúng, nó sẽ nhập tệp đó vào liên kết và nếu tìm thấy cả hai trong cùng một thư mục tìm kiếm, nó sẽ thích hơn libfoo.so. Nếu libfoo.so, được chọn thì trình liên kết sẽ thêm DSO đó vào danh sách phụ thuộc thời gian chạy của bất kỳ chương trình hoặc DSO nào bạn đang thực hiện. Nếu libfoo.ađược chọn thì trình liên kết sử dụng kho lưu trữ như một lựa chọn các tệp đối tượng để liên kết vào tệp đầu ra, nếu cần, ngay tại đó và sau đó. Không phụ thuộc thời gian chạy vào libfoo.achính nó là có thể; nó không thể được ánh xạ vào một quá trình; nó không có nghĩa gì với trình tải hệ điều hành.

Sao chép từ https://stackoverflow.com/a/47924864/195787 .

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.