`-fpic`과`-fPIC` gcc 매개 변수의 차이점은 무엇입니까?


96

난 이미 읽은 gcc맨 페이지를,하지만, 난 여전히 사이의 차이를 이해할 수 없다 -fpic-fPIC. 누군가 매우 간단하고 명확하게 설명 할 수 있습니까?


관련 질문 :


1
예 대답은 아닙니다 man gcc그러나에 info gcc더 많은 문서를 가지고있는.
user2284570

답변:


109

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

사용 -fPIC또는 -fpic위치 독립적 인 코드를 생성 할 수 있습니다. 위치 독립적 코드 를 사용 -fPIC하거나 -fpic생성 할지 여부 는 대상에 따라 다릅니다. -fPIC선택은 항상 작동하지만,보다 큰 코드를 생성 할 수있다 -fpic(이것은이 코드의 더 많은 양을 생산할 수 있도록 PIC가 더 큰 경우에 있음을 기억하는 mnenomic). -fpic옵션을 사용하면 일반적으로 더 작고 빠른 코드가 생성되지만 전역 적으로 표시되는 기호 수 또는 코드 크기와 같은 플랫폼에 따라 제한이 있습니다. 링커는 공유 라이브러리를 만들 때 적합한 지 여부를 알려줍니다. 의심 스러울 때는 -fPIC항상 작동하기 때문에를 선택 합니다.


33
나는 (x86_64의 플랫폼에서) 여기에 약간의 실험을했다 : 무슨 일이 더 -fPIC-fpic동일한 코드를 생성 한 것으로 보인다. m68k, PowerPC 및 SPARC에서만 다른 코드를 생성하는 것 같습니다.
Denilson Sá Maia 2011 년

3
특정 대상에 대해 한 가지 방식으로 컴파일 된 한 버전의 gcc를 사용한 단일 실험. 그 결과를 염분으로 가져 가십시오. GCC와 같은 도구를 사용하면 시간이 지남에 따라 결과가 변경 될 수 있습니다.
old_timer

뭐 좀 물어봐도 될까요; 무엇을 않습니다 세계적으로 볼 기호는 의미?
Константин Ван aug

17

로부터 GCC 매뉴얼 페이지 :

공유 라이브러리에 대한 코드를 생성 할 때 -fpic은 -msmall-data를 의미하고 -fPIC는 -mlarge-data를 의미합니다.

어디:

 -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.

링크 된 매뉴얼 페이지가 업데이트되었습니다. 꼭 확인하세요.
youfu
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.