2009-11-17 3 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가 일반 용도로 사용 가능하지 않다는 것을 의미하며 이는 최적화에 반드시 영향을 미칩니다. 아마도 컴파일러는 레지스터 스케줄링 압력 때문에 꼬리 재귀 최적화에 반대하기로 결정했습니다.

관련 문제