← man/dev_and_programming
ranlib — man ranlib — 80×24
ugur@toprak:~/man/dev_and_programming$man ranlib
Bölüm 1 Geliştirme & Programlama

ranlib

statik kütüphaneler oluşturmak ranlib - arşiv kütüphanelerinin içindekiler tablosunu eklemek veya güncellemek

Sözdizimi

       libtool -static -o output [ -sacLTD ] [ - ] [ -arch_only arch_type ] [
       -no_warning_for_no_symbols ] [ -encode_sdk_libraries_as_references ] [ -ref-l ] [
       -ref-framework ] file...  [-filelist listfile[,dirname]]

       ranlib [ -sactfqLT ] [ - ] archive...

Açıklama

libtool komutu, belirtilen girdi nesne dosyalarını alır ve ld(1) bağlantı düzenleyicisi ile kullanılmak üzere bir kütüphane oluşturur. Kütüphanenin adı output (-o bayrağının argümanı) ile belirtilir. Girdi nesne dosyaları, nesne dosyaları içeren herhangi bir doğru biçimde olabilir (örn. "evrensel" dosyalar, arşivler, nesne dosyaları). Libtool, çıktı kütüphanesine nesne dosyası olmayan hiçbir girdi dosyasını koymaz (üzerinde işlem yaptığı arşivlerde buna izin veren ranlib'in aksine).

Aynı CPU tipine ve farklı CPU alt tiplerine sahip nesnelerden "evrensel" bir dosya üretilirken, libtool ve ranlib her bir benzersiz CPU tipi ve CPU alt tipi eşleşmesi için evrensel bir dosyada ayrı bir kütüphane oluşturmak yerine, her CPU tipi için en fazla bir kütüphane oluşturur. Bu nedenle, her kütüphane için ortaya çıkan CPU alt tipi, o CPU tipi için _ALL CPU alt tipidir. Bu strateji, bir kütüphaneyi geliştiren kişiyi, bağlantı zamanında değil, çalışma zamanında çalıştırılacak en uygun kodu seçen tek bir kütüphane oluşturmaya güçlü bir şekilde teşvik eder.

ARŞİV (veya statik) KÜTÜPHANELERİ -static seçeneği ile libtool, ar(5) ve ranlib komutlarının yerini alması için tasarlanmıştır. Geriye dönük uyumluluk için ranlib hala mevcuttur ve evrensel dosyaları destekler. Ranlib, ld(1) bağlantı düzenleyicisi tarafından bağlanabilmesi için her arşive bir içindekiler tablosu ekler veya mevcut olanı günceller. İçindekiler tablosu, arşivin başında yer alan ve hangi sembollerin hangi kütüphane üyelerinde tanımlandığını gösteren bir arşiv üyesidir. Ranlib arşivi yeniden yazdığı için, geçerli dizini içeren dosya sisteminde yeterli geçici dosya alanı bulunmalıdır. Ranlib, tüm doğru kütüphane biçimlerini (arşiv içeren evrensel dosyalar ve basit arşivler) alır ve dosyadaki tüm arşivlerin içindekiler tablosunu günceller. Ranlib ayrıca, üyeleri evrensel nesne dosyaları olan arşivler gibi yaygın bir hatalı arşiv biçimini de kabul eder, içindekiler tablosunu ekler veya günceller ve kütüphaneyi doğru biçimde (birden fazla arşiv içeren evrensel bir dosya) üretir.

İçindekiler tablosu için arşiv üyesi adı "__.SYMDEF" ile başlar. Şu anda libtool -static ve ranlib tarafından üretilen ve ld(1) bağlantı düzenleyicisi tarafından anlaşılan iki tür içindekiler tablosu bulunmaktadır. Bunlar aşağıda -s and -a seçenekleri altında açıklanmıştır.

Seçenekler

Aşağıdaki seçenekler yalnızca libtool için geçerlidir.

@file Bu argümanları komut satırında listelemeye alternatif olarak, @ ile başlayan argümanlar belirtilen dosyadan okunan argümanlarla değiştirilir. Dosyalar basitçe boşluk karakterleri (boşluklar, sekmeler ve satır sonları) ile ayrılmış libtool seçeneklerini ve dosyalarını içerir. Boşluk karakterleri ve diğer ters eğik çizgiler dahil olmak üzere karakterler ters eğik çizgi () ile kaçış karakterine dönüştürülebilir. Ayrıca boşluk içeren argümanlar tamamen veya kısmen tek veya çift tırnak karakterleri içine alınabilir. Bu dosyalar ek dosyalara yönelik @file referansları içerebilir, ancak libtool iç içe döngü içeren referanslarda hata verecektir. Bir dosya bulunamazsa, orijinal @file argümanı argüman listesinde kalacaktır.

-static Girdi dosyalarından statik olarak bağlanmış bir (arşiv) kütüphane üretir. Varsayılan değer budur.

-encode_sdk_libraries_as_references Bir statik kütüphane oluştururken, bu seçenek komut satırında belirtilen ve SDK'da bulunan tüm statik kütüphanelerin, oluşturulmakta olan statik kütüphaneye dahil edilmesi yerine bir otomatik bağlantı (auto-link) ipucu olarak kodlanacağı anlamına gelir.

-ref-lname Bu seçenek, belirtilen kütüphane adı için bir otomatik bağlantı ipucu kodlamak üzere -static ile birlikte kullanılır.

-ref-framework name Bu seçenek, belirtilen çerçeve (framework) adı için bir otomatik bağlantı ipucu kodlamak üzere -static ile birlikte kullanılır. Statik kütüphane oluştururken bu seçenek, iki veya daha fazla üye (nesne dosyası) aynı yaprak ada (leaf name) sahip olduğunda bir uyarı verilmesini sağlar; çünkü arşiv bir dizine çıkarıldığında bunlar çakışacaktır.

  • -V: libtool sürümünü yazdırır.

-filelist listfile[,dirname] listfile dosyası dosya adlarının bir listesini içerir ve komut satırında dosya adlarını belirtmenin alternatif bir yoludur. Dosya adları yalnızca satır sonlarıyla ayrılmış şekilde satır başına bir tane olacak şekilde listelenir (boşluk ve sekmelerin dosya adının bir parçası olduğu varsayılır). İsteğe bağlı dizin adı dirname belirtilirse, liste dosyasındaki her adın başına bu dizin adı eklenir.

-arch_only arch_type Bu seçenek, libtool'un yalnızca belirtilen arch_type için bir kütüphane oluşturmasına neden olur ve girdi dosyalarındaki diğer tüm mimarileri yok sayar. Dinamik bir kütüphane oluştururken, bu seçenek aile cpusubtype dışındaki belirli bir cpusubtype ile belirtilmişse, libtool ld(1) -force_cpusubtype_ALL bayrağını kullanmaz ve ld(1)'ye -arch_only argümanını -arch bayrağı olarak iletir, böylece çıktı o cpusubtype ile etiketlenir.

Aşağıdaki seçenekler bir arşiv kütüphanesinin içindekiler tablosuyla ilgilidir ve hem libtool -static hem de ranlib için geçerlidir:

  • -s: Arşiv ile bağlama yaparken daha hızlı bağlantı düzenlemesi sağlayan tercih edilen içindekiler tablosu türünü üretir. İçindekiler tablosunun sırası sembol adına göre sıralanır. Bu tür içindekiler tablosunun kütüphane üye adı "__.SYMDEF SORTED" olur. Bu tür içindekiler tablosu yalnızca kütüphanede aynı sembolü tanımlayan birden fazla üye bulunmadığında üretilebilir. Varsayılan değer budur.

  • -a: Sırası arşivdeki üyelerin sırasına dayanan orijinal içindekiler tablosu türünü üretir. Bu tür içindekiler tablosunun kütüphane üye adı "__.SYMDEF" olur. Kütüphanede aynı sembolü tanımlayan birden fazla üye olduğunda bu tür içindekiler tablosu kullanılmalıdır.

  • -c: İçindekiler tablosuna göre ortak sembolleri tanım olarak dahil eder. Bu, bir kütüphaneden bağlama yaparken nadiren amaçlanan bir davranıştır; çünkü bağlamanın o noktasında tanımlanmamış, başlatılmamış bir genel (global) değişken kullandığı için bir kütüphane üyesinin bağlanmasını zorunlu kılar. Bu seçenek yalnızca ranlib'in orijinal davranışı bu olduğu için dahil edilmiştir. Varsayılan davranış bu değildir.

  • -L: Arşiv üye adlarının 16 karakterden uzun olmasına ve adlarında boşluk bulunmasına izin veren 4.4bsd arşiv genişletilmiş biçim #1'i kullanır. Varsayılan seçenek budur.

  • -T: Arşiv üye adlarını 16 karakterle sınırlar ve 4.4bsd genişletilmiş biçim #1'i kullanmaz. Varsayılan davranış bu değildir.

  • -f: Çıktı arşivi evrensel olduğunda ve ar(1) artık üzerinde işlem yapamayacak durumda olduğunda uyarır.

  • -q: Evrensel bir dosya oluşturulacaksa hiçbir şey yapmaz.

  • -D: Statik bir kütüphane oluştururken, arşiv içeriğinin kullanıcı kimliklerini (user id), grup kimliklerini (group id), tarihlerini ve dosya modlarını makul varsayılan değerlere ayarlar. Bu, günün saatinden, kullanıcıdan, gruptan, umask'tan ve ortamın diğer yönlerinden bağımsız olarak, özdeş girdilerle oluşturulan kütüphanelerin birbiriyle tamamen aynı olmasını sağlar.

Uyumluluk için, aşağıdaki ranlib seçeneği kabul edilir (ancak yok sayılır):

  • -t: Bu seçenek, ranlib'in arşivleri değiştirmek yerine yalnızca onlara "dokunmasını" (touch) talep etmek için kullanılırdı. Bu seçenek artık yok sayılmakta ve içindekiler tablosu yeniden oluşturulmaktadır.

Hem libtool hem de ranlib için geçerli olan diğer seçenekler:

  •  Kalan tüm argümanları seçenek olarak değil, dosya (veya arşiv) adları olarak kabul eder.
    

-no_warning_for_no_symbols Sembol içermeyen dosyalar hakkında uyarı vermez.

-dependency_info path Başarılı bir derleme işlemini açıklayan bir Xcode bağımlılık bilgi (dependency info) dosyası yazar. Bu dosya, kütüphaneyi veya dylib'i oluşturmak için doğrudan veya dolaylı olarak kullanılan girdileri açıklar.

Ayrıca Bakınız

ld(1), ar(1), otool(1), make(1), ar(5)

Hatalar

Kütüphanelerin önceden oluşturulma şekli nedeniyle, kütüphane ar(1) ile değiştirildiğinde ve ranlib(1) yeniden çalıştırılarak içindekiler tablosu güncellenmediğinde hatalar oluşabiliyordu. Bu yüzden önceden bağlantı düzenleyici ld(1), bir kütüphanenin değiştirilme tarihi içindekiler tablosunun oluşturulma tarihinden daha yeni olduğunda bir hata üretiyordu. Ne yazık ki bu, kütüphaneyi yalnızca kopyalasanız bile hata alacağınız anlamına geliyordu. Bu hatanın çok fazla sıkıntı oluşturduğu tespit edildiğinden kaldırılmıştır. Bu yüzden artık kütüphane değiştirildiğinde ve içindekiler tablosu güncellenmediğinde tekrar bağlantı hataları almak mümkündür.

Apple Inc. 6 Şubat 2025 LIBTOOL(1)