Przeczytałem już stronę gcc
podręcznika, ale nadal nie rozumiem różnicy między -fpic
i -fPIC
. Czy ktoś może to wyjaśnić w bardzo prosty i jasny sposób?
Powiązane pytania:
Przeczytałem już stronę gcc
podręcznika, ale nadal nie rozumiem różnicy między -fpic
i -fPIC
. Czy ktoś może to wyjaśnić w bardzo prosty i jasny sposób?
Powiązane pytania:
Odpowiedzi:
http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html
Użyj -fPIC
lub, -fpic
aby wygenerować kod niezależny od pozycji. To, czy użyć, -fPIC
czy -fpic
wygenerować kod niezależny od pozycji, zależy od celu. -fPIC
Wybór zawsze działa, ale może wytwarzać większy niż kod -fpic
(mnenomic do zapamiętania jest to, że PIC jest w większej sprawy, więc może produkować większe ilości kodu). Korzystanie z -fpic
opcji zwykle generuje mniejszy i szybszy kod, ale będzie mieć ograniczenia zależne od platformy, takie jak liczba globalnie widocznych symboli lub rozmiar kodu. Linker powie Ci, czy pasuje, kiedy tworzysz udostępnioną bibliotekę. W razie wątpliwości wybieram -fPIC
, bo to zawsze działa.
-fPIC
i -fpic
wydaje się, że wygenerowałem ten sam kod. Wygląda na to, że generują inny kod tylko na m68k, PowerPC i SPARC.
Ze strony podręcznika Gcc :
Podczas generowania kodu dla bibliotek współdzielonych -fpic implikuje -msmall-data, a -fPIC implikuje -mlarge-data.
Gdzie:
-msmall-data
-mlarge-data
When -mexplicit-relocs is in effect, static data is accessed via
gp-relative relocations. When -msmall-data is used, objects 8
bytes long or smaller are placed in a small data area (the
".sdata" and ".sbss" sections) and are accessed via 16-bit
relocations off of the $gp register. This limits the size of the
small data area to 64KB, but allows the variables to be directly
accessed via a single instruction.
The default is -mlarge-data. With this option the data area is
limited to just below 2GB. Programs that require more than 2GB
of data must use "malloc" or "mmap" to allocate the data in the
heap instead of in the program's data segment.
When generating code for shared libraries, -fpic implies
-msmall-data and -fPIC implies -mlarge-data.
man gcc
ale winfo gcc
, które mają więcej dokumentacji.