' -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?
' -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?
Yanıtlar:
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.
/usr/bin/ld: /tmp/cc7hXILq.o: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
fPIC ekledim ve inşa ettim.
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, fpic
m68K 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.
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.