문제

컴파일하는 경우 공유 라이브러리 the gcc-fPIC 옵션을 컴파일 코드는 위치 독립적입니다.어떤 이유가 있습(performance 또는 기타)을 왜 당신이 컴파일되지 않는 모든 코드는 위치 독립적인?

도움이 되었습니까?

해결책

간접을 추가합니다. 위치 독립 코드를 사용하면 기능 주소를로드 한 다음 점프해야합니다. 일반적으로 함수의 주소는 이미 명령 스트림에 있습니다.

다른 팁

예를 구현하면 성능이 저하될 수 있 이유입니다.일부 액세스는 효과적으로 다른 레이어의 간접을 얻을 절대 위치 메모리에 있습니다.

또한어(오프셋 글로벌 테이블)을 저장하는 오프셋의 글로벌 변수입니다.나에게,이처럼 보인 IAT fixup 테이블,으로 분류되는 위치의 종속성과 몇 가지 다른 소스입니다.

http://en.wikipedia.org/wiki/Position_independent_code

이 기사 PIC의 작동 방식을 설명하고 대안과 비교합니다. 로드 시간 재배치. 나는 그것이 당신의 질문과 관련이 있다고 생각합니다.

허용 된 답변 외에도. PIC 코드 성능을 많이 아프게하는 한 가지는 X86에서 "IP 상대 주소"가 부족하다는 것입니다. "IP 상대 주소"를 사용하면 현재 명령어 포인터의 x 바이트 인 데이터를 요청할 수 있습니다. 이것은 그림 코드를 훨씬 간단하게 만듭니다.

점프와 전화는 일반적으로 EIP 친척이므로 실제로 문제가되지 않습니다. 그러나 데이터에 액세스하려면 약간의 추가 속임수가 필요합니다. 때로는 레지스터가 일시적으로 코드가 요구하는 데이터에 대한 "기본 포인터"로 예약됩니다. 예를 들어, 일반적인 기술은 x86에서 호출이 작동하는 방식을 남용하는 것입니다.

call label_1
.dd 0xdeadbeef
.dd 0xfeedf00d
.dd 0x11223344
label_1:
pop ebp            ; now ebp holds the address of the first dataword
                   ; this works because the call pushes the **next**
                   ; instructions address
                   ; real code follows
mov eax, [ebp + 4] ; for example i'm accessing the '0xfeedf00d' in a PIC way

이 기술과 다른 기술은 데이터 액세스에 간접 계층을 추가합니다. 예를 들어, GCC 컴파일러가 사용하는 GOT (Global Offset Table).

x86-64는 "RIP 상대"모드를 추가하여 많은 더 간단합니다.

완전히 위치 위치를 구현하면 독립 코드를 구현하면 코드 생성기에 제약 조건이 추가되어 더 빠른 작업의 사용을 방지하거나 해당 제약 조건을 보존하기위한 추가 단계를 추가 할 수 있습니다.

이는 가상 메모리 시스템없이 멀티 프로세싱을 얻는 데 허용되는 트레이드 오프 일 수 있습니다. 여기서 서로의 메모리를 침해하지 않도록 프로세스를 신뢰하고 모든 기본 주소에 특정 응용 프로그램을로드해야 할 수도 있습니다.

많은 현대 시스템에서 성능 트레이드 오프는 다르며, 재배치 로더는 종종 자유 통치가있는 경우 최적화기가 할 수있는 최상의 최상의 비용보다 저렴합니다 (시간 코드가 먼저로드됩니다). 또한 가상 주소 공간의 가용성은 처음에 위치 독립성에 대한 동기의 대부분을 숨 깁니다.

또한 대부분의 최신 프로세서 (대부분의 최신 OS에서 사용)의 가상 메모리 하드웨어는 많은 코드 (모든 사용자 공간 앱, 기발한 MMAP 등 사용을 제외하고)를 독립적으로 위치 할 필요가 없음을 의미합니다. 모든 프로그램은 자체 주소 공간을 가져옵니다.

position-independent code 추가 레지스터가 필요하기 때문에 대부분의 아키텍처에서 성능 오버 헤드가 있습니다.

따라서 이것은 성능 목적입니다.

요즘 운영 체제 및 컴파일러 기본적으로 모든 코드를 위치 독립 코드로 만듭니다. -fpic 플래그없이 컴파일을 시도하면 코드가 잘 컴파일되지만 경고를 얻을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top