2014-11-29 3 views
0

아시다시피, 컴파일러는 연속적인 대형 스위치 코드 블록, C++ 용 가상 함수 테이블 및 일부 꼬리 호출 상황에서 간접 점프를 생성합니다. 또한 함수에 대한 포인터에 대한 간접 호출 (점프가 아님). 간접 점프를 사용하는 다른 모든 상황?컴파일러는 언제 C 언어로 x86_64에 대한 간접 점프를 생성합니까? 컴파일러에게 간접 점프가 발생하지 않도록 할 수 있습니까?

또한 컴파일러 (clang/llvm preferred)에게 필요한 경우가 아니면 간접 호출을 생성하지 않도록 지정할 수 있습니까?

나는 이것에 대한 연구를하고 있기 때문에 이상한 질문 일 수 있습니다.

+0

간접 점프 사용은 * 절대로 * 필요 없습니다. 핀치 (pinch)에서는 타겟 어드레스를 푸시 (push)하고 나서 복귀 (return)하는 것으로 대체 할 수있다. 어쨌든 비효율적입니다. – Deduplicator

+0

직접 점프 또는 달리기 전에 결정될 수있는 것으로 대체 할 수있는 방법은 무엇입니까? – WindChaser

답변

0

간접 점프 또는 호출에는 일반적으로 포인터 (주소) 배열이 관련됩니다. 스위치 케이스 시퀀스 외에도 Microsoft 컴파일러는 디버그 모드로 빌드 할 때 함수에 대한 포인터 배열을 생성합니다 (릴리스 모드에서는이 명령이 수행되지 않았 음을 확신합니다). 나는 그것을 어떻게 무력화 시킬지 모른다. 컨텍스트를 전환하는 데 사용되는 간접 호출도 있지만 일반적인 C/C++ 코드에서는 문제가되어서는 안됩니다.

+0

"컨텍스트를 전환하는 데 사용됩니다"는 다른 코드 세그먼트로 멀리 이동한다는 의미입니다. – WindChaser

+0

@WindChaser - 전환 컨텍스트는 전환 작업에 대한 호출을 통해 수행됩니다. 작업 스위치를 수행하는 방법에 대해 아래로 스크롤하십시오. [call task switch] (http://x86.renejeschke.de/html/file_module_x86_id_26.html). 또한 권한 수준 링크를 변경하는 데 사용되는 게이트 호출이 있습니다. [wiki call gate] (http://en.wikipedia.org/wiki/Call_gate) – rcgldr

+0

@rcgldr : 콜 게이트, 작업 및 모든 나머지는 피할 수 있습니다. 수십 년? – Deduplicator