GNU 컴파일러에서 컴파일하는 동안 -mpreferred-stack-boundary
옵션의 사용법을 알고 싶습니다. 나는 문서를 확인했지만 설명은 나에게 없어졌다. 누군가 설명해 주시겠습니까?gcc -mpreferred-stack-boundary 옵션
답변
GNU 디버거에서 컴파일하는 동안 -mpreferred-stack-boundary 옵션의 용도를 알고 싶습니다.
옵션은 디버거와는 이 전혀이 없습니다.
바이너리에서 생성 된 코드에 영향을 미칩니다. 기본적으로 GCC는 모든 항목이 즉시 입력 할 때 스택 포인터가 16 바이트 경계에 정렬되도록 정렬합니다 (로컬 변수가있는 경우 중요 할 수 있으며 sse2
명령어를 사용 가능하게 설정).
기본값을 예 -mpreferred-stack-boundary=2
이면 GCC는 스택 포인터를 4 바이트 경계에 맞 춥니 다. 이렇게하면 루틴 요구 사항이 줄어들지 만 코드 (또는 호출 한 코드) 이을 사용하면 sse2
이되므로 일반적으로 안전하지 않습니다.
프로그램에서 메모리에 레이아웃 할 때 사용하는 바이트 경계와 관련이 있습니다.
스택 경계 = 2는 스택이 dword 크기 증분으로 설정되도록 보장하므로 시스템이 스택을 최적화하지 못하게합니다.
체크 아웃 경우
:의 num 바이트 경계에 제기 2 정렬 스택 경계를 유지하는`info gcc and search by entering "/mpreferred-stack-boundary"` it says:
>-mpreferred-stack-boundary=num
>
시도합니다. -mpreferred-stack-boundary를 지정하지 않으면 기본값은 4 (16 바이트 또는 128 비트)입니다.
4의 기본 스택 경계는 Intel 386 및 AMD x86-64 시스템에서 모두 동일합니다.
내 64 비트 리눅스 머신 컴파일에서 "m-선호하는 스택 경계 = 2"옵션을 사용하려고
는 = 2가"-mpreffered 스택 경계 오류와 함께 실패 4에서 12 "사이가 아닙니다.
이는 64 비트 컴퓨터에서 주소 필드의 너비가 4 바이트에서 8 바이트로 증가했기 때문입니다. 따라서 2^2 = 4 바이트이기 때문에 스택 경계 = 2에 개별 청크를 쓸 수 없습니다. 그러나 흥미롭게도 3의 스택 경계는 32 비트와 64 비트 컴퓨터에서 여전히 8 바이트 경계가되는 오류를 반환합니다.
10 개의 평판이 없기 때문에 링크를 포함 할 수 없지만 ... 검색을하면 쉽게 검색 할 수 있습니다. 8 바이트는 스택의 위치를 잘못 맞추기 쉽기 때문에 보안 기능이라고 말할 수 있습니다. ... 의심의 여지가 다른 사람이 더 잘 알고, 또는 자세한 내용이 있습니다.
How the stack got misaligned 말한다 :
스택이 값의 적절한 정렬을 보장하기 위해, 상기 스택 경계는 스택에 저장되어있는 값에 의해 요구되는 것과 일치해야한다. 또한 모든 함수는 스택을 정렬 된 상태로 유지하도록 생성되어야합니다. 따라서 우선 순위가 낮은 스택 경계로 컴파일 된 함수에서 상위 우선 순위 스택 경계로 컴파일 된 함수를 호출하면 스택이 잘못 정렬 될 가능성이 큽니다. 콜백을 사용하는 라이브러리는 항상 기본 설정을 사용하는 것이 좋습니다.
이 여분의 정렬은 여분의 스택 공간을 소비하며 일반적으로 코드 크기를 증가시킵니다. 임베디드 시스템 및 운영 체제 커널과 같이 스택 공간 사용에 민감한 코드는 기본 정렬을 -mpreferred-stack-boundary = 2로 줄여야 할 수 있습니다.
- 1. Gcc 컴파일러 명령 및 옵션
- 2. gcc std = gnu ++ 0x 옵션
- 3. JNI 용 .so를 만들 때 gcc 옵션
- 4. gcc -l 옵션 및 .la 라이브러리 파일
- 5. gcc 옵션 -fstack-check은 정확히 어떻게 작동합니까?
- 6. 주어진 CPU 아키텍처에서의 최적화를위한 GCC 옵션
- 7. C : gcc 환경 용 디버깅 옵션
- 8. 경고 아이디로 경고 메시지를 가져 오는 g ++ 또는 gcc 옵션
- 9. minGW gcc 명령 줄 옵션 '-Wl'/ 'Wa'/ 'Wp'
- 10. 배정 밀도 부동 소수점 연산을위한 GCC 특수 최적화 옵션
- 11. gcc 옵션 : return 문없이 비공 사 함수에 대한 경고
- 12. GDB로 디버깅 할 때 문제를 일으킬 수있는 GCC 옵션
- 13. gcc 버전 4.1.2에서 "인식 할 수없는 옵션 -Xa"가 표시됨
- 14. Macake X에서 CMake/GCC "인식 할 수없는 옵션"
- 15. GCC 및 GCC 버전
- 16. gcc with gcc 4.4.3
- 17. Mac에서의 GCC 대 리눅스에서의 GCC
- 18. GCC : GCC 버전 간 위장
- 19. gcc 컴파일 플래그
- 20. 엑스 코드 컴파일 옵션
- 21. -gcc에 대한 정적 옵션?
- 22. GCC 다중 최적화 플래그
- 23. Keil 대 ARM7 용 GCC?
- 24. 은 gcc-4와 호환되는 gcc-3 바이너리입니다.
- 25. 성능 비교 - gcc 및 llvm-gcc
- 26. gcc/최적화 플래그의 지속성 변경 gcc/C
- 27. Mac OSX의 GCC - 여러 버전의 gcc
- 28. 어떻게 GCC
- 29. GCC 성능
- 30. GCC 템플릿은
+1 실제 경계 크기는 2^PSB라고 언급 할 가치가 있습니다. 이 매개 변수를 2로 설정하면 경계 크기가 2^2 = 4가됩니다. 이 값을 4로 설정하면 경계 크기가 2^4 = 16이됩니다. –