IT이야기

공유 라이브러리를 구축할 때 -fPIC는 무엇을 의미하는가?

cyworld 2022. 4. 16. 12:43
반응형

공유 라이브러리를 구축할 때 -fPIC는 무엇을 의미하는가?

'알고 있다.'-fPIC'옵션은 주소 해결과 개별 모듈 간의 독립성과 관련이 있지만, 그게 무슨 뜻인지는 잘 모르겠다.설명할래요?

PIC는 Position Independent Code를 의미한다.

인용하다man gcc:

대상 시스템에 대해 지원되는 경우, 동적 연결에 적합하고 전역 오프셋 테이블 크기에 대한 제한을 방지하는 위치 독립 코드를 방출하십시오.이 옵션은 AArch64, m68k, PowerPC 및 SPARC에서 차이를 만든다.

언급된 아키텍처에서 공유 개체(*.so)를 구축할 때 이 기능을 사용하십시오.

f"코드 생성에 사용되는 인터페이스 규칙을 제어하는" 옵션에 대한 gcc 접두사

PIC"입장 독립 코드"를 의미하며, 그것은 전문화 되어 있다.fpicM68K 및 SPARC용.

편집: 0x6adb015에서 참조한 문서의 11페이지와 코리안 코멘트를 읽은 후 다음과 같이 몇 가지 변경사항을 적용했다.

이 옵션은 공유 라이브러리에만 해당되며 OS에 글로벌 오프셋 테이블을 사용 중임을 알 수 있다. 이는 모든 주소 참조가 GOT에 상대적이며 코드를 여러 프로세스에 걸쳐 공유할 수 있음을 의미한다.

그렇지 않으면, 이 옵션이 없다면, 로더는 모든 오프셋 자체를 수정해야 할 것이다.

말할 필요도 없이, 우리는 거의 항상 -fpic/PIC를 사용한다.

man gcc다음과 같이 말한다.

-fpic공유에서 사용하기에 적합한 PIC(위치 독립 코드) 생성대상 시스템에 대해 지원되는 경우 라이브러리.이러한 코드가 모든 항목에 액세스GOT(Global Offset Table)를 통한 상수 주소.다이나믹로더는 프로그램이 시작될 때 GOT 항목을 해결함(동적)로더는 GCC의 일부가 아니며 운영 체제의 일부임).만약연결된 실행 파일의 GOT 크기가 시스템별 크기를 초과함최대 크기, 링커에서 오류 메시지가 표시됨-fpic은 작동하지 않는다. 이 경우 -fPIC로 대신 컴파일한다.
(이러한 최대값은 SPARC의 경우 8k, m68k 및 RS/6000의 경우 32k이다.386은 그런 한계가 없다.)

위치 독립 코드에는 특별한 지원이 필요하므로특정 기계에서만 작동한다.386의 경우 GCC가 PIC를 지원한다.시스템 V 그러나 태양 386i를 위한 것은 아니다.에 대해 생성된 코드:IBM RS/6000은 항상 포지션에 독립적이다.

-fPIC대상 시스템에 대해 지원되는 경우 위치 독립 코드를 내보냄동적 연결 및 크기 제한에 적합전역 간격띄우기 표이 옵션은 m68k에서 차이를 만든다.SPARC도 있고.

위치 독립 코드에는 특별한 지원이 필요하므로특정 기계에서만 작동한다.

참조URL: https://stackoverflow.com/questions/966960/what-does-fpic-mean-when-building-a-shared-library

반응형