apa itu ranlib?


13

Saya telah menggunakan sistem MacOSX untuk sementara waktu, tetapi baru-baru ini saja mulai menusuk ke dalam nyali. Saya menemukan panduan yang memberi tahu saya untuk menjalankan 'sudo ranlib /usr/local/lib/libjpeg.a'( menginstal libjpeg). Saya telah membaca manual ranlib, dan mencoba mencari secara online. Saya tidak mengerti. Sumber daya apa yang perlu saya cari untuk mempelajari lebih lanjut, atau bisakah seseorang memberikan penjelasan singkat tentang penggunaannya? Terima kasih sebelumnya!

Jawaban:


7

ranlibmenambah atau memperbarui file objek di perpustakaan statis . Linker dapat menggunakan pustaka statis saat menautkan untuk memberikan simbol yang dibutuhkan kode agar dapat beroperasi (berbeda dengan loader yang mencarinya di pustaka dinamis saat menjalankan executable).


Hai Ignacio, terima kasih atas tanggapannya. Apakah ini berarti bahwa jika saya menjalankan ranlib di perpustakaan, itu akan tersedia untuk digunakan setiap kali linker mencoba 'referensi' itu? Bagaimana cara menghapusnya?
Ying

ranlibdigunakan untuk membuat dan memodifikasi perpustakaan. Terserah linker untuk menggunakannya, biasanya dengan melewati lokasi perpustakaan dan / atau nama pada baris perintah. Lihat -Ldan -largumen ke gcc untuk detailnya.
Ignacio Vazquez-Abrams

5
Tetapi tidak arjuga melakukan itu? Apa bedanya?
greatwolf

18

Deskripsi ini terlihat cukup jelas: http://sourceware.org/binutils/docs/binutils/ranlib.html

Jadi, jika Anda mengarsipkan kumpulan file objek, katakan:

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

Lalu berlari

$ ranlib fruits.a

membuat indeks isi buah.a dan menyimpan indeks dalam buah.a. Ini berguna untuk menghubungkan dan jika benda saling memanggil.


"ranlib menghasilkan indeks ke isi arsip dan menyimpannya di arsip". Ini kedengarannya lebih seperti sesuatu untuk digabungkan dengan tardan saya akan mengatakan tidak terlalu jelas.
Codebling

9

ranlib menghasilkan indeks untuk isi arsip dan menyimpannya dalam arsip. Indeks mencantumkan setiap simbol yang ditentukan oleh anggota arsip yang merupakan file objek yang dapat dipindahkan. Arsip dengan indeks seperti itu mempercepat penautan ke perpustakaan dan memungkinkan rutinitas di perpustakaan untuk saling memanggil tanpa memperhatikan penempatannya dalam arsip.

sumber: halaman manual ranlib


2

ar

Di Linux, aradalah pengarsip tujuan umum GNU. (Ada varian non-GNU ardi OS mirip Unix lainnya). Dengan opsic

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

Ini menciptakan arsip yang berisi salinan file.... Secara archive-namekonvensional tetapi tidak harus memiliki ekstensi .a(untuk arsip ). Masing file...- masing dapat berupa file apa pun, tidak harus berupa file objek.

Ketika file yang diarsipkan adalah semua file objek, biasanya niat untuk menggunakan arsip untuk mengirimkan pilihan file objek ke dalam tautan program atau DSO (Dynamic Shared Objects). Dalam hal ini archive-namejuga akan secara konvensional diberikan awalan lib, misalnya libfoo.a, sehingga dapat ditemukan sebagai file input calon linker melalui opsi linker -lfoo.

Digunakan sebagai file input linker, libfoo.abiasanya disebut perpustakaan statis . Penggunaan ini merupakan sumber kebingungan berkesinambungan bagi programmer yang tidak mahir, karena hal itu membuat mereka berpikir bahwa arsip libfoo.asama dengan DSO libfoo.so, biasanya disebut perpustakaan dinamis / bersama , dan untuk membangun harapan yang salah atas dasar ini. Sebenarnya "perpustakaan statis" dan "perpustakaan dinamis" sama sekali tidak sama dan digunakan dalam hubungan dengan cara yang sangat berbeda.

Perbedaan mencolok adalah bahwa perpustakaan statis tidak diproduksi oleh linker , tetapi dengan ar. Jadi tidak ada hubungan yang terjadi, tidak ada resolusi simbol yang terjadi. File objek yang diarsipkan tidak berubah: mereka hanya dimasukkan ke dalam tas.

Ketika sebuah arsip adalah masukan dalam keterkaitan sesuatu yang yang dihasilkan oleh linker - seperti program atau DSO - terlihat linker dalam tas untuk melihat apakah ada file objek di dalamnya yang memberikan definisi untuk referensi simbol terselesaikan yang masih harus dibayar sebelumnya dalam tautan. Jika menemukan apapun, ekstrak file-file objek dari tas dan link mereka ke dalam file output, persis seperti jika mereka diberi nama individual di commandline linker dan arsip tidak disebutkan sama sekali. Jadi seluruh peran arsip dalam tautan adalah sebagai sekumpulan file objek yang darinya tautan dapat memilih yang diperlukan untuk melanjutkan tautan tersebut.

Secara default, GNU armembuat arsip outputnya siap digunakan sebagai input linker. Itu menambahkan "file" palsu ke arsip, dengan nama file sihir palsu, dan dalam file palsu ini menulis konten yang bisa dibaca oleh linker sebagai tabel pencarian dari simbol global yang ditentukan oleh file objek apa pun dalam arsip. ke nama dan posisi file objek tersebut dalam arsip. Tabel pencarian inilah yang memungkinkan tautan untuk melihat dalam arsip dan mengidentifikasi file objek apa pun yang menentukan referensi simbol yang belum terselesaikan yang telah ada di tangannya.

Anda dapat menekan pembuatan atau memperbarui tabel pencarian ini dengan opsi q(= cepat ) - yang sebenarnya telah Anda gunakan dalam arcontoh Anda sendiri - dan juga dengan opsi (modal) S(= tidak ada tabel simbol ). Dan jika Anda memohon aruntuk membuat atau memperbarui arsip yang tidak memiliki tabel simbol (uptodate) karena alasan apa pun, maka Anda dapat memberikannya dengan sopsi.

ranlib

ranlibtidak membuat perpustakaan sama sekali. Di Linux, ranlibadalah program lawas yang menambahkan tabel simbol (uptodate) ke ararsip jika tidak ada. Efeknya persis sama dengan ar s, dengan GNU ar. Secara historis, sebelum ardiperlengkapi untuk menghasilkan tabel simbol itu sendiri, ranlibadalah kludge yang menyuntikkan file palsu sihir ke dalam arsip untuk memungkinkan linker untuk mengambil file objek dari itu. Dalam OS non-GNU Unix-like, ranlibmungkin masih diperlukan untuk tujuan ini. Contoh Anda:

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

mengatakan:

  • Buat libgraphics.adengan menambahkan arsip semua *.ofile di direktori saat ini, tanpa tabel simbol.
  • Kemudian tambahkan tabel simbol ke libgraphics.a

Di linux, ini memiliki efek bersih yang sama dengan:

ar cr libgraphics.a *.o

Dengan sendirinya,, ar qc libgraphics.a *.omembuat arsip yang tidak dapat digunakan tautan, karena tidak memiliki tabel simbol.

ld

Contoh Anda:

ld -r -o libgraphics.a *.o

sebenarnya cukup ortodoks. Ini menggambarkan penggunaan cukup langka dari linker , ld, untuk menghasilkan gabungan file objek dengan menghubungkan beberapa file masukan ke dalam file output objek tunggal, di mana resolusi simbol telah dilakukan sejauh mungkin , mengingat input file. Opsi -r(= relocatable ) mengarahkan linker untuk menghasilkan target file objek (bukan program, atau DSO) dengan menghubungkan input sejauh mungkin dan tidak gagal linkaqe jika referensi simbol yang tidak ditentukan tetap di file output. Penggunaan ini disebut penautan parsial .

File output ld -r ... adalah file objek, bukan ar arsip , dan menentukan nama file output yang terlihat seperti ararsip tidak membuatnya menjadi satu. Jadi contoh Anda menggambarkan penipuan. Ini:

ld -r -o graphics.o *.o

akan jujur. Tidak jelas bagi saya apa tujuan penipuan semacam itu, karena bahkan jika file objek ELF dipanggil libgraphics.a, dan merupakan input ke tautan baik dengan nama itu, atau oleh -lgraphics, linker akan dengan benar mengidentifikasi itu sebagai file objek ELF , bukan ararsip, dan akan mengonsumsinya dengan cara ia menggunakan file objek apa pun di commandline: itu menghubungkannya tanpa syarat ke file output, sedangkan titik memasukkan arsip asli adalah untuk menautkan anggota arsip hanya dengan menautkan anggota arsip hanya dengan syarat bahwa mereka direferensikan . Mungkin Anda hanya memiliki contoh tautan yang kurang informasi di sini.

Membungkus...

Kami sebenarnya hanya melihat satu cara menghasilkan sesuatu yang secara konvensional disebut perpustakaan , dan itulah produksi yang disebut perpustakaan statis , dengan mengarsipkan beberapa file objek dan meletakkan tabel simbol dalam arsip.

Dan kita belum melihat sama sekali bagaimana menghasilkan hal lain dan yang paling penting yang secara konvensional disebut perpustakaan , yaitu Dynamic Shared Object / shared library / dynamic library.

Seperti sebuah program, DSO diproduksi oleh tautan . Sebuah program dan DSO adalah varian binari ELF yang dipahami oleh pemuat OS dan dapat digunakan untuk merakit proses yang sedang berjalan. Biasanya kita memanggil linker melalui salah satu salah satu frontends GCC ( gcc, g++, gfortran, dll):

Menautkan suatu program:

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

Menautkan DSO:

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

Baik pustaka bersama dan pustaka statis dapat ditawarkan ke tautan dengan -lfooprotokol seragam , saat Anda menautkan beberapa program atau DSO lainnya. Opsi itu mengarahkan tautan untuk memindai direktori pencarian yang ditentukan atau default untuk menemukan salah satu libfoo.soatau libfoo.a. Secara default, setelah menemukan salah satu dari mereka itu akan memasukkan file itu ke tautan, dan jika menemukan keduanya di direktori pencarian yang sama, itu akan lebih disukai libfoo.so. Jika libfoo.so, dipilih maka penghubung menambahkan DSO ke daftar ketergantungan runtime dari program atau DSO apa pun yang Anda buat. Jika libfoo.adipilih maka linker menggunakan arsip sebagai pilihan file objek untuk linkage ke file output, jika diperlukan, di sana dan kemudian. Tidak ada ketergantungan runtime aktif libfoo.aitu sendiri mungkin; itu tidak dapat dipetakan ke dalam suatu proses; itu tidak ada artinya bagi pemuat OS.

Disalin dari https://stackoverflow.com/a/47924864/195787 .

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.