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ı .