GCC 옵션 질문 드립니다.

Fe.head의 이미지

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 단위로 메모리를 확보하는 컴파일하는 방법이 있는것으로 아는데..
이 옵션을 가르켜 주세요..

kagi의 이미지

다음 옵션을 사용해 보세요.

`-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'.

Fe.head의 이미지

답변 감사합니다. kagi님..

하지만.. 이건 아니군요..

가장 적은값으로 하면 32가 나오는데..

제가 바란 값은 8이었습니다....

아.. 누구 알고 계신분은 답변을.. 전에 한번봤는데.. 까먹습니다.. 흐흑

고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"

eminency의 이미지

이건 제 추측입니다. -_-

함수가 스택에 쌓이면.. 기본적으로 나중에 리턴할 레지스터 주소값과 전역변수를 참조하기 위한 주소값 등을 기본적으로 스택에 쌓고 시작하는 걸로 아는데요...

어셈블리는 잘 모릅니다만 함수의 그런 기본 정보들을 저장하기 위한 공간 때문에 스택 영역이 좀 더 많이 잡히는게 아닐까요..?

아니면 그걸 제외하고 32바이트가 쌓인다는 얘긴가..? -_-;;

노루가 사냥꾼의 손에서 벗어나는 것 같이, 새가 그물치는 자의 손에서 벗어나는 것 같이 스스로 구원하라 -잠언 6:5

kagi의 이미지

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관련 강좌를 올리고 계신)께 질문을 드렸던 적이 있었는데 답변해주신내용이 안보이는군요.

Fe.head의 이미지

오 2.95에서 되는군요.. 감사..
확인 결과 됩니다..

다행히 debian sid 쓰니깐..
gcc-2.95로 컴파일하니깐 되네요

void
test()
{
    char a[3];
    char b[3];
}

test:
    pushl %ebp
    movl %esp,%ebp 
    subl $8,%esp

kagi님. 감사합니다.. 행복하세요..^^;

고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.