Paylaşılan bir kitaplık oluştururken -fPIC ne anlama geliyor?


109

' -fPIC' Seçeneğinin adresleri çözme ve tek tek modüller arasındaki bağımsızlıkla bir ilgisi olduğunu biliyorum , ancak gerçekte ne anlama geldiğinden emin değilim. Açıklayabilir misin?


1
Ayrıca daha ayrıntılı bilgi edinmek istemeniz durumunda, burada harika bir makale var ( akkadia.org/drepper/dsohowto.pdf )
MJ

Yanıtlar:


61

PIC, Pozisyondan Bağımsız Kod anlamına gelir

ve alıntı yapmak için man gcc:

Hedef makine için destekleniyorsa, dinamik bağlantı için uygun konumdan bağımsız kod yayınlayın ve global ofset tablosunun boyutunda herhangi bir sınırdan kaçının. Bu seçenek m68k, PowerPC ve SPARC'de fark yaratır. Konumdan bağımsız kod özel destek gerektirir ve bu nedenle yalnızca belirli makinelerde çalışır.

belirtilen mimariler üzerinde paylaşılan nesneler (* .so) oluştururken bunu kullanın.


1
f hiçbir şey ifade etmiyor, sadece seçenek adının bir parçası.
Zifre

17
Fpic ve fPIC arasında bir fark var. İkisi de aynı şeyi yapar, ancak fpic mümkün olduğunda daha kısa bir göreli ofset kullanır. Bu nedenle fpic ile derleme, potansiyel olarak daha küçük dosyalar üretebilir. Ne yazık ki her zaman beklendiği gibi çalışmaz, bu nedenle fPIC kullanın. Ayrıca, tüm işlemcilerin daha kısa ofsetleri desteklemediğini ve bu nedenle bir fark yaratmayabileceğini unutmayın.
Martin York

2
'F', gcc'nin komut satırı argümanlarını işleme biçiminden kaynaklanan bir akşamdan kalmadır (bu birkaç yıl önceydi ve kodun son zamanlarda bakmadığım bu kısmını değiştirdiler). Ancak o zamanlar farklı koşullar altında yalnızca belirli harflere veya kombinasyonlara izin veriliyordu (komut satırı argümanlarını tanımlamak için çok karmaşık bir dil vardı), sonuç olarak komut satırı argümanı olarak tanımlamayı kolaylaştırmak için "f" kullanıldı.
Martin York

2
FPIC olmadan bir * .so oluşturulursa ne olur?
Isa A

2
@IsaA Bugün kaynaktan bir c-api mysql işlevi derliyordum ve oluşturulmayacaktı, ben de /usr/bin/ld: /tmp/cc7hXILq.o: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPICfPIC ekledim ve inşa ettim.
chiliNUT

32

f"Kod oluşturma kullanılan arayüz kurallarını kontrol" olduğunu seçenekleri için gcc öneki

PIC"Position Independent Code" anlamına gelen standlar, fpicm68K ve SPARC için bir uzmanlıktır .

Düzenleme: 0x6adb015 tarafından referans verilen belgenin 11. sayfasını ve coryan'ın yorumunu okuduktan sonra birkaç değişiklik yaptım:

Bu seçenek yalnızca paylaşılan kitaplıklar için anlamlıdır ve işletim sistemine Global Ofset Tablosu kullandığınızı söylüyorsunuz, GOT. Bu, tüm adres referanslarınızın GOT ile ilgili olduğu ve kodun birden çok işlemde paylaşılabileceği anlamına gelir.

Aksi takdirde, bu seçenek olmadan, yükleyicinin tüm ofsetleri kendisi değiştirmesi gerekecektir.

Söylemeye gerek yok, neredeyse her zaman -fpic / PIC kullanırız.


1
İşletim sisteminin kitaplığı herhangi bir sanal adrese yüklemekte özgür olduğunu düşündüm, ancak pic / PIC olmadan yükleyicinin kodu değiştirmesi ve tüm mutlak sıçramaları + indirimleri rutinlerin / kitaplıkların gerçek konumlarına ayarlaması gerekir. Pic / PIC ile kod değiştirilmez ve bu nedenle birden çok işlemde gerçekten paylaşılır.
coryan

Birden çok işlem büyük ölçüde rastlantısaldır - kilit nokta, kodun mutlak minimum adres düzeltme ile herhangi bir sanal adrese yüklenebilmesidir.
Jonathan Leffler

16

man gcc diyor:

-fpic
  Paylaşılan bir uygulamada kullanıma uygun konumdan bağımsız kod (PIC) oluşturun.
  kitaplık, hedef makine için destekleniyorsa. Böyle bir kod tüm
  bir global ofset tablosu (GOT) aracılığıyla sabit adresler. Dinamik
  yükleyici, program başladığında GOT girdilerini çözer (dinamik
  yükleyici GCC'nin bir parçası değildir; işletim sisteminin bir parçasıdır). Eğer
  bağlantılı yürütülebilir dosyanın GOT boyutu makineye özgü bir değeri aşıyor
  maksimum boyut, bağlayıcıdan belirten bir hata mesajı alırsınız
  that -fpic çalışmıyor; bu durumda -fPIC ile yeniden derleyin.
  (Bu maksimum değerler SPARC'da 8k ve m68k ve RS / 6000'de 32k'dir.
  386'nın böyle bir sınırı yoktur.)

  Konumdan bağımsız kod özel destek gerektirir ve bu nedenle
  yalnızca belirli makinelerde çalışır. 386 için GCC, PIC'yi destekler
  System V ancak Sun 386i için değil. İçin oluşturulan kod
  IBM RS / 6000 her zaman konumdan bağımsızdır.

-fpic
  Hedef makine için destekleniyorsa, konumdan bağımsız kod yayınlayın,
  dinamik bağlantı için uygundur ve boyutunda herhangi bir sınırlamadan kaçınmak
  küresel ofset tablosu. Bu seçenek m68k'de bir fark yaratır
  ve SPARC.

  Konumdan bağımsız kod özel destek gerektirir ve bu nedenle
  yalnızca belirli makinelerde çalışır.
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.