ranlib nedir?


13

Bir süredir bir MacOSX sistemi kullanıyorum, ancak sadece son zamanlarda cesaretlere bakmaya başladım. Bana 'sudo ranlib /usr/local/lib/libjpeg.a'( libjpeg kurulumu) çalıştırmamı söyleyen bir rehber buldum. Ranlib kılavuzunu okudum ve çevrimiçi bakmayı denedim. Sadece anlamıyorum. Daha fazla bilgi edinmek için hangi kaynaklara ihtiyacım var, yoksa birisi kullanımı hakkında kısa bir açıklama yapabilir mi? Şimdiden teşekkürler!

Yanıtlar:


7

ranlibemailleri veya güncellemeleri nesne dosyaları bir de statik kitaplığında . Zaman Bağlayıcılar statik kütüphanelerini kullanabilirsiniz bağlama sağlamak amacıyla semboller (aksine sırayla kod ihtiyaçları işletmek o yükleyici içinde onları arıyor dinamik kütüphaneleri yürütülebilir çalıştırırken).


Merhaba Ignacio, cevap için teşekkürler. Bu, bir kütüphanede ranlib yürütürsem, bir bağlayıcının ona 'referans' vermeye çalıştığı her seferde kullanılabileceği anlamına mı geliyor? Nasıl kaldırılır?
Ying

ranlibkütüphaneleri oluşturmak ve değiştirmek için kullanılır. Genellikle komut satırında kütüphane konumunu ve / veya adını geçirerek bunları kullanmak bağlayıcıya bağlıdır. Ayrıntılar için -Lve -lgcc değişkenine bakın.
Ignacio Vazquez-Abrams

5
Ama bunu arda yapmıyor mu? Fark ne?
greatwolf

18

Bu açıklama oldukça açık görünüyor: http://sourceware.org/binutils/docs/binutils/ranlib.html

Bir nesne dosyaları koleksiyonunu arşivlerseniz, şunları söyleyin:

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

Sonra koşuyor

$ ranlib fruits.a

meyvelerin içeriğinin bir indeksini oluşturur. a ve indeksi meyvelerde saklar. Bu, bağlantı için ve nesnelerin birbirini çağırması durumunda faydalıdır.


msgstr "ranlib bir arşivin içeriğine bir dizin oluşturur ve onu arşivde saklar". Bu daha çok kombine edilecek bir şey gibi geliyor tarve çok net değil diyebilirim.
Codebling

9

ranlib bir arşivin içeriğine bir dizin oluşturur ve onu arşivde saklar. Dizin, bir arşivin bir üyesi tarafından tanımlanan, yeniden yerleştirilebilir bir nesne dosyası olan her sembolü listeler. Böyle bir dizine sahip bir arşiv, kütüphaneye bağlantıyı hızlandırır ve kütüphanedeki rutinlerin, arşive yerleştirilmelerine bakılmaksızın birbirlerini aramasına izin verir.

Kaynak: ranlib man page


2

ar

Linux'ta arGNU genel amaçlı arşivleyici. ( arDiğer Unix benzeri işletim sistemlerinde GNU olmayan varyantlar vardır ). Seçeneği ilec

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

Öğesinin kopyalarını içeren bir arşiv oluşturur file.... archive-nameGeleneksel fakat zorunlu uzantısına sahip .aiçin ( arşiv ). Her biri file...bir nesne dosyası değil, her türlü dosya olabilir.

Arşivlenen dosyaların tümü nesne dosyaları olduğunda, bu nesne dosyalarının seçimini programların veya DSO'ların (Dinamik Paylaşılan Nesneler) bağlantısına sunmak için genellikle arşivi kullanmak niyetidir. Bu durumda archive-nameda geleneksel olarak önek verilecektir lib, örneğin libfoo.ao bağlayıcı seçeneği aracılığıyla aday bağlayıcı girdi dosyası olarak keşfedilebilir böylece, -lfoo.

Bağlayıcı girdi dosyası olarak kullanılır libfoo.a, normalde statik kitaplık olarak adlandırılır . Bu kullanım, uzman olmayan programcılar için sürekli bir karışıklık kaynağıdır, çünkü bir arşivin normalde dinamik / paylaşılan kütüphane olarak adlandırılan bir libfoo.aDSO ile aynı türden bir şey olduğunu düşünmelerine ve bu temelde yanlış beklentiler oluşturmasına neden olur. Aslında bir "statik kütüphane" ve bir "dinamik kütüphane" benzer şeyler değildir ve bağlantıda tamamen farklı şekillerde kullanılır.libfoo.so

Bariz bir fark, bir statik kitaplığı tarafından üretilmez olmasıdır bağlayıcı ama göre ar. Yani bağlantı olmaz, sembol çözünürlüğü olmaz. Arşivlenen nesne dosyaları değişmez: sadece bir torbaya konurlar.

Bir arşiv şeyin bağlantıda girildiğinde edilir tahakkuk çözümlenmemiş sembol referanslar tanımlarını sağlamak içinde hiç nesne dosyaları olup olmadığını görmek için torba içinde bağlayıcı görünüyor - Böyle bir program veya DSO olarak - linker tarafından üretilen bağlantıda daha erken. Herhangi bulursa, torba gelenler nesne dosyaları ayıklar ve bağlantılar bunları onlar bağlayıcı komut ayrı ayrı adlandırılmış ve arşiv hiç bahsedilmeyen tam olarak sanki çıkış dosyasının içine. Dolayısıyla, bir arşivin bağlantıdaki tüm rolü, bağlayıcının bağlantıda taşıması gerekenleri seçebileceği nesne dosyaları torbasıdır.

GNU varsayılan olarak arçıktı arşivlerini bağlayıcı girişleri olarak kullanıma hazır hale getirir. Arşive sihirli bir sahte dosya adı ile sahte bir "dosya" ekler ve bu sahte dosyada, bağlayıcının arşivdeki herhangi bir nesne dosyası tarafından tanımlanan genel sembollerden bir arama tablosu olarak okuyabileceği içerik yazar arşivdeki bu nesne dosyalarının adlarına ve konumlarına. Bu arama tablosu, bağlayıcının arşive bakmasını ve elinde çözülmemiş sembol referanslarını tanımlayan herhangi bir nesne dosyasını tanımlamasını sağlar.

Bu arama tablosunun oluşturulmasını veya güncellenmesini ( aslında kendi örneğinizde kullandığınız) q(= hızlı ) seçeneğiyle arve ayrıca (büyük harf) S(= sembol tablosu yok ) seçeneğiyle engelleyebilirsiniz. Ve arherhangi bir nedenle (güncel) sembol tablosu olmayan bir arşiv oluşturmaya veya güncellemeye çağırırsanız, seçenekle birlikte bir arşiv verebilirsiniz s.

runlib

ranlibhiç kütüphane oluşturmaz. Linux'ta, ranlibbir ararşivi yoksa (güncel) bir sembol tablosu ekleyen eski bir programdır . Etkisi ar sGNU ile tamamen aynıdır ar. Tarihsel olarak, daha önce arbir sembol tablosu oluşturmak için donatılmıştı ranlib, linkerin nesne dosyalarını seçmesini sağlamak için sihirli sahte dosyayı bir arşive enjekte eden çamurdu. GNU Unix benzeri olmayan işletim sistemlerinde ranlibbu amaç için yine de gerekli olabilir. Örneğiniz:

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

diyor:

  • Mevcut dizindeki libgraphics.atüm *.odosyaları sembol tablosu olmadan bir arşive ekleyerek oluşturun .
  • Ardından şuraya bir sembol tablosu ekleyin: libgraphics.a

Linux'ta, bunun net etkisi vardır:

ar cr libgraphics.a *.o

Tek başına, ar qc libgraphics.a *.obağlayıcı tablosunun kullanamayacağı bir arşiv oluşturur, çünkü sembol tablosu yoktur.

ld

Örneğiniz:

ld -r -o libgraphics.a *.o

aslında oldukça alışılmışın dışında. Bu oldukça nadir kullanımını göstermektedir bağlayıcı , ldbir üretme birleştirilmiş sembol çözünürlüğü yapılmıştır ettiği tek çıkış nesne dosyası içine birden fazla giriş dosyaları bağlayarak nesne dosyası uzak olduğu kadar mümkündür girdi dosyaları göz önüne alındığında,. -r(= Yeniden yerleştirilebilir ) seçeneği tanımsız simge referansları çıktı dosyası kalırsa linkaqe başarısız mümkün olduğunca olup girdileri bağlayarak bir amacı, bir dosya hedef (yerine bir program ya da DSO) üretilmesi için bağlayıcı yönlendirir. Bu kullanıma kısmi bağlantı denir .

Çıkış dosyası ld -r ... bir nesne dosyası değil, bir olan ar arşiv ve bu bir çıkış dosya adı belirterek bakışlar bir olduğu gibi ararşivde o birini yapmaz. Yani örneğiniz bir aldatmacayı göstermektedir. Bu:

ld -r -o graphics.o *.o

doğrudur. Böyle bir aldatmacanın amacının ne olabileceği bana açık değil, çünkü bir ELF nesne dosyası çağrılsa bile libgraphics.ave bu adla ya -lgraphicsda bağlayıcının bağlantıyı bir ELF nesne dosyası olarak doğru şekilde tanımlayacağı halde , bir ararşiv değil ve bunu komut satırındaki herhangi bir nesne dosyasını tüketme biçiminde tüketir: koşulsuz olarak çıktı dosyasına bağlar, oysa gerçek bir arşivi girme noktası arşiv üyelerini yalnızca referans verildikleri takdirde bağlamaktır . Belki de burada kötü bilgili bir bağlantı örneği var.

Siliniyor ...

Aslında geleneksel olarak kütüphane olarak adlandırılan bir şey üretmenin yalnızca bir yolunu gördük ve bu , bazı nesne dosyalarını arşivleyerek ve arşive bir sembol tablosu koyarak, sözde statik bir kütüphane üretimi .

Ve geleneksel olarak bir kütüphane olarak adlandırılan diğer ve en önemli şeyi , yani Dinamik Paylaşılan Nesne / paylaşılan kütüphane / dinamik kütüphane olarak nasıl üreteceğimizi hiç görmedik .

Bir program gibi, bağlayıcı tarafından bir DSO üretilir . Bir program ve bir DSO, işletim sistemi yükleyicisinin anladığı ve çalışan bir işlemi birleştirmek için kullanabileceği ELF ikili varyantlarıdır. Genellikle bir GCC ön uç bir (yoluyla bağlayıcı çağırmak gcc, g++, gfortran, vs.):

Bir programı bağlama:

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

Bir DSO'yu bağlama:

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

-lfooBaşka bir programı veya DSO'yu bağlarken, hem paylaşılan kütüphaneler hem de statik kütüphaneler tekdüzen protokolle bağdaştırıcıya sunulabilir . Bu seçenek, bağlayıcıyı belirtilen veya varsayılan arama yönergelerini taramaya yönlendirir libfoo.soveya libfoo.a. Varsayılan olarak, ikisinden birini bulduğunda bağlantıya bu dosyayı girer ve her ikisini de aynı arama dizininde bulursa, tercih eder libfoo.so. Eğer libfoo.soseçilirse, bağlayıcı o DSO'yu yaptığınız programın veya DSO'nun çalışma zamanı bağımlılık listesine ekler. Seçilirse libfoo.a, bağlayıcı, gerekirse çıktı dosyasına bağlantı için arşivi bir nesne dosyası seçimi olarak kullanır. Üzerinde çalışma zamanı bağımlılığı yok libfoo.akendisi mümkündür; bir sürece eşleştirilemez; işletim sistemi yükleyicisi için hiçbir şey ifade etmiyor.

Https://stackoverflow.com/a/47924864/195787 adresinden kopyalandı .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.