Jaka jest różnica między parametrami gcc „-fpic” i „-fPIC”?

99

Przeczytałem już stronę gccpodręcznika, ale nadal nie rozumiem różnicy między -fpici -fPIC. Czy ktoś może to wyjaśnić w bardzo prosty i jasny sposób?


Powiązane pytania:

Denilson Sá Maia
źródło
1
Tak, odpowiedzi nie ma, man gccale w info gcc, które mają więcej dokumentacji.
user2284570

Odpowiedzi:

114

http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html

Użyj -fPIClub, -fpicaby wygenerować kod niezależny od pozycji. To, czy użyć, -fPICczy -fpicwygenerować kod niezależny od pozycji, zależy od celu. -fPICWybó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 -fpicopcji 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.

Anycorn
źródło
35
Co więcej: zrobiłem tutaj mały eksperyment (na platformie x86_64) -fPICi -fpicwydaje się, że wygenerowałem ten sam kod. Wygląda na to, że generują inny kod tylko na m68k, PowerPC i SPARC.
Denilson Sá Maia
4
Pojedynczy eksperyment z jedną wersją gcc skompilowaną w jeden sposób dla jakiegoś celu. Przyjmij ten wynik z przymrużeniem oka, spodziewaj się, że wynik będzie się zmieniał w czasie, szczególnie w przypadku narzędzia takiego jak GCC.
old_timer
Mogę zadać pytanie; co oznaczają symbole widoczne na całym świecie ?
Константин Ван
18

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.
Alexandro de Oliveira
źródło
1
Połączona strona podręcznika została zaktualizowana, pamiętaj, aby sprawdzić.
youfu