gcc 의 옵션중 fomit-frame-point 는 정확히 무엇을 하는건가요?

voider의 이미지

많은 곳에서 -O 옵션과 함께 이 옵션이 사용되는데
문서를 읽어봐도 몬소리인지 이해가 안갑니다.(영어가 시로 ㅠ.ㅠ)
--------------------------------------------------------------------------------------
`-fomit-frame-pointer'
Don't keep the frame pointer in a register for functions that
don't need one. This avoids the instructions to save, set up and
restore frame pointers; it also makes an extra register available
in many functions. *It also makes debugging impossible on some
machines.*

On some machines, such as the Vax, this flag has no effect, because
the standard calling sequence automatically handles the frame
pointer and nothing is saved by pretending it doesn't exist. The
machine-description macro `FRAME_POINTER_REQUIRED' controls
whether a target machine supports this flag. *Note Registers::.
-------------------------------------------------------------------------------------

프레임 포인터가 멀 말하는지도 자세히 모르겠네요...

익명 사용자의 이미지

x86에서 C 프로그램을 짜서 컴파일을 해보면 함수 입구에는

pushl %ebp
movl %esp,%ebp
가 있고

출구에는
popl %ebp가 있는 걸 볼 수 있습니다. 이 %ebp 레지스터를 프레임 포인터라고 하고, %ebp 레지스터로 나누어진 스택 공간의 경계를 스택 프레임이라고 합니다. 스택 프레임을 쓰면 항상 4(%ebp)는 리턴 주소, 8(%ebp)는 항상 첫번째 인수, 12(%ebp)는 두번째 인수, ...가 되고 (%ebp)는 원래 %ebp 레지스터의 값, -4(%ebp)는 첫번째 지역 변수, -8(%ebp)은 두번째 지역 변수, ...가 되지요.

스택 프레임을 쓰면 디버그하기가 아주 편리합니다. 지역변수와 인수의 위치가 항상 고정되어 있으니까요. 반면 %ebp 레지스터를 다른 용도로 쓰지 못하게 되므로 최적화 여지가 그만큼 줄어든다는 단점이 있지요.

체스맨의 이미지

함수 호출을 하면, 함수에 전달되는 인자 및 함수 안에서 사용되는
지역 변수들을 위해 stack frame 이라는 것을 형성하게 되는데,
이때 스택의 특정 위치를 가리키게 되는 포인터가 frame pointer 입니다.

이런 작업을 하지 않아도 될 함수들은 frame pointer 를 제거해서
거기에 필요한 연산을 줄이는 옵션입니다.

참조 링크:

http://www.eventhelix.com/RealtimeMantra/Basics/CToAssemblyTranslation.htm
http://chortle.ccsu.edu/AssemblyTutorial/Chapter-28/ass28_4.html

Orion Project : http://orionids.org

체스맨의 이미지

늦었군요. -_-
이런 질문에 답이 안달렸길래, 답을 다실것으로 예상되는 분들이
출타중이시라 생각했건만. :)

Orion Project : http://orionids.org

익명 사용자의 이미지

체스맨 wrote:
늦었군요. -_-
이런 질문에 답이 안달렸길래, 답을 다실것으로 예상되는 분들이
출타중이시라 생각했건만. :)

빨리 달려고 허둥지둥하다 엄청 많이 틀려서 수정을 여러 차례 했습니다. 8)
maximus의 이미지

그렇군요... 많이 배웠습니다..

=================================
:: how about a cup of tea ? ::
=================================

aeronova의 이미지

음, 오늘 좋은 거 배웠네요.
gentoo에서 빌드할때 항상 붙는 옵션이라서, 궁금했었는데..
귀차니즘 때문에 그려려니하고 있다가, 오늘에서야 알게 되네요. :)

It's better to burn out than to fade away. -- Kurt Cobain.

voider의 이미지

감사합니다...

-- 아쉬운 하루 되세요 --

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.