2012-04-20 1 views
11

GNU 컴파일러에서 컴파일하는 동안 -mpreferred-stack-boundary 옵션의 사용법을 알고 싶습니다. 나는 문서를 확인했지만 설명은 나에게 없어졌다. 누군가 설명해 주시겠습니까?gcc -mpreferred-stack-boundary 옵션

답변

9

GNU 디버거에서 컴파일하는 동안 -mpreferred-stack-boundary 옵션의 용도를 알고 싶습니다.

옵션은 디버거와는 이 전혀이 없습니다.

바이너리에서 생성 된 코드에 영향을 미칩니다. 기본적으로 GCC는 모든 항목이 즉시 입력 할 때 스택 포인터가 16 바이트 경계에 정렬되도록 정렬합니다 (로컬 변수가있는 경우 중요 할 수 있으며 sse2 명령어를 사용 가능하게 설정).

기본값을 예 -mpreferred-stack-boundary=2이면 GCC는 스택 포인터를 4 바이트 경계에 맞 춥니 다. 이렇게하면 루틴 요구 사항이 줄어들지 만 코드 (또는 호출 한 코드) 을 사용하면 sse2이되므로 일반적으로 안전하지 않습니다.

+2

+1 실제 경계 크기는 2^PSB라고 언급 할 가치가 있습니다. 이 매개 변수를 2로 설정하면 경계 크기가 2^2 = 4가됩니다. 이 값을 4로 설정하면 경계 크기가 2^4 = 16이됩니다. –

0

프로그램에서 메모리에 레이아웃 할 때 사용하는 바이트 경계와 관련이 있습니다.

스택 경계 = 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로 줄여야 할 수 있습니다.