GCC 옵션 질문 드립니다.
글쓴이: Fe.head / 작성시간: 일, 2003/11/02 - 10:19오후
gcc 컴파일시에 -S 해서 어셈블리 코드로 보면
char a[3] 변수를 선언하면 4byte 크기의 스택영역을 확보해야 맞는데.
보안상 이유로 컴파일러가 일아서 크기를 변화시키는데요..
C언어 소스
void test() { char a[3]; char b[3]; }
어셈 소스
test: pushl %ebp movl %esp, %ebp subl $40, %esp leave ret
위의 것처럼 원래는 8byte를 확보해야하는데..
여기서는 40Byte를 확보하는군요..
gcc 옵션중 이것을 4Byte 단위로 메모리를 확보하는 컴파일하는 방법이 있는것으로 아는데..
이 옵션을 가르켜 주세요..
Forums:
다음 옵션을 사용해 보세요.`-mpreferred-stack-bo
다음 옵션을 사용해 보세요.
`-mpreferred-stack-boundary=NUM'
Attempt to keep the stack boundary aligned to a 2 raised to NUM
byte boundary. If `-mpreferred-stack-boundary' is not specified,
the default is 4 (16 bytes or 128 bits).
The stack is required to be aligned on a 4 byte boundary. On
Pentium and PentiumPro, `double' and `long double' values should be
aligned to an 8 byte boundary (see `-malign-double') or suffer
significant run time performance penalties. On Pentium III, the
Streaming SIMD Extension (SSE) data type `__m128' suffers similar
penalties if it is not 16 byte aligned.
To ensure proper alignment of this values on the stack, the stack
boundary must be as aligned as that required by any value stored
on the stack. Further, every function must be generated such that
it keeps the stack aligned. Thus calling a function compiled with
a higher preferred stack boundary from a function compiled with a
lower preferred stack boundary will most likely misalign the
stack. It is recommended that libraries that use callbacks always
use the default setting.
This extra alignment does consume extra stack space. Code that is
sensitive to stack space usage, such as embedded systems and
operating system kernels, may want to reduce the preferred
alignment to `-mpreferred-stack-boundary=2'.
답변 감사합니다. kagi님..하지만.. 이건 아니군요..
답변 감사합니다. kagi님..
하지만.. 이건 아니군요..
가장 적은값으로 하면 32가 나오는데..
제가 바란 값은 8이었습니다....
아.. 누구 알고 계신분은 답변을.. 전에 한번봤는데.. 까먹습니다.. 흐흑
고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"
이건 제 추측입니다. -_-함수가 스택에 쌓이면.. 기본적으로 나
이건 제 추측입니다. -_-
함수가 스택에 쌓이면.. 기본적으로 나중에 리턴할 레지스터 주소값과 전역변수를 참조하기 위한 주소값 등을 기본적으로 스택에 쌓고 시작하는 걸로 아는데요...
어셈블리는 잘 모릅니다만 함수의 그런 기본 정보들을 저장하기 위한 공간 때문에 스택 영역이 좀 더 많이 잡히는게 아닐까요..?
아니면 그걸 제외하고 32바이트가 쌓인다는 얘긴가..? -_-;;
노루가 사냥꾼의 손에서 벗어나는 것 같이, 새가 그물치는 자의 손에서 벗어나는 것 같이 스스로 구원하라 -잠언 6:5
gcc 3.0 이상이시군요 :-) Debian GNU/Linux wood
gcc 3.0 이상이시군요 :-) Debian GNU/Linux woody에서 gcc 2.95.x 버전에서는 옵션이 없을경우 24, 옵션을 줄경우 8바이트가 잡힙니다. 말씀하신대로 gcc 3.0.4에서 테스트 해보니 32바이트가 잡힙니다.
예전에 테스트한 결과..
gcc 3.0이상에서는 스택에 대해 16(2^4)바이트 정렬이 이루어집니다. 따라서 코드에서 3바이트 배열 두개가 선언되어 각 16바이트 합 32바이트에 함수의 SFP와 RET를 위한 8바이트에 대한 정렬값(추측) 8바이트 도합 40바이트가 잡힙니다.
이때 스택 정렬 옵션을 2로 준경우 2^2, 즉 4바이트 정렬이 이루어집니다. 이경우 32바이트 정렬이 이루어졌죠. 즉 SFP와 RET를 위해 정렬에 들어갔던 8바이트(여전히 추측)는 없어졌으나 배열은 여전히 16바이트로 정렬이 이루어졌기 때문입니다.
여기서 왜 4바이트 정렬이 이루어지지 않는가, 그 이유는 저도 모르겠습니다. 예전에 테스트했을때도 원인을 찾지 못했었던듯 싶습니다. 원인을 찾아내시고 해결 방안을 찾아내시면 알려주시면 감사하겠습니다.
제대로된 답변이 못되어서 죄송합니다.
예전에 관련내용과 비슷한 내용으로 정원교님(강좌란에 GCC관련 강좌를 올리고 계신)께 질문을 드렸던 적이 있었는데 답변해주신내용이 안보이는군요.
오 2.95에서 되는군요.. 감사..확인 결과 됩니다..다행히
오 2.95에서 되는군요.. 감사..
확인 결과 됩니다..
다행히 debian sid 쓰니깐..
gcc-2.95로 컴파일하니깐 되네요
kagi님. 감사합니다.. 행복하세요..^^;
고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"
댓글 달기