2009-11-17 2 views
3

이 질문에 이어 : how-do-i-check-if-gcc-is-performing-tail-recursion-optimization, gcc를 -fPIC와 함께 사용하면이 최적화가 파괴 된 것으로 나타났습니다. 공유 라이브러리를 만들었지 만 -fPIC 옵션이 필요하지 않은 것 같습니다.gcc -fPIC은 최적화 플래그가 붙어있는 것 같아

음, 내 질문은, 왜 - fPIC가 gcc 최적화를 변경합니까? 어떤 이유로 든 -fPIC을 보관해야합니까?

위치 종속 코드에서

꼬리 재귀 최적화가 현재 스택 프레임을 재사용하고 교체하는 본질적 : 이러한 타겟 아키텍처 및 컴파일러 버전과 세부 없을

+0

설명하는 동작을 재현 할 수있는 방법을 제공해 주시겠습니까? 그것은 옳지 않습니다. 그러나,'gcc'의 구현에있어서의 내부적 인 제약은 아마도 PIC 모드에서 최적화를 불가능하게 할 수도 있습니다 ... –

+0

어떤 버전의 GCC입니까? 어떤 플랫폼? '-fPIC'은 생성 된 코드를 '위치 독립적 코드'(따라서 PIC)로 변경하기 때문에 '위치 종속 코드'와 다를 수 있습니다. 어떤 옵션을 사용하고 있습니까? –

+0

아, 64 비트 서버에서 -fPIC이 필요합니다. – user212658

답변

4

는 가능한 설명은 이것이 calljump으로 간주합니다. 구문은 call functionjmp <small offset of function>으로 바뀌었을 수 있습니다.

위치 독립적 코드에서 명령어 세트가 허용하는 경우 호출을 call [email protected] (이 예제는 amd64)이라고 쓸 수 있습니다. jmp <small offset of function>@PLT으로 완벽하게 대체 될 수는 있지만 두 설정이 간섭을 일으키고 gcc 개발자는 후자 모드에서 꼬리 - 호출 최적화를 구현하지 못했을 것입니다.

2

ia32 linux에서 fpic을 사용한다는 것은 ebx가 일반 용도로 사용 가능하지 않다는 것을 의미하며 이는 최적화에 반드시 영향을 미칩니다. 아마도 컴파일러는 레지스터 스케줄링 압력 때문에 꼬리 재귀 최적화에 반대하기로 결정했습니다.