[완료] static 함수가 프로그램 이미지 상에서는 어디에 위치하나요??

plustag의 이미지

보통 프로그램이 메모리에 로드되면
코드, 데이터, 스택, 힙 으로 나뉘고
함수는 호출될 때 활성화 레코드로 스택에 push되는데
함수를 static으로 선언해도 동일하게 스택에 들어가는지 아니면 다른 곳에 위치하는지 알고 싶습니다.

static함수는 내부에서만 참조가 가능한데..(뭐 함수 포인터로 어떻게 하면 참조가 가능하긴 하지만)
이런거는 컴파일러가 처리하는 것인지 프로세스내에서 처리하는 것인지도 알고 싶습니다..

익명 사용자의 이미지

코드는 이미지상 .text에 들어갑니다.

함수 콜시 스택에 들어가는 것은 아규먼트와 리턴 어드레스입니다.
함수 코드 (기계어)가 아닙니다.

plustag의 이미지

함수의 코드가 스택에 들어가는게 아닌건 알고 있는데
static으로 선언하게 되면
해당 함수가 호출될 때 활성화 레코드가 다른 함수처럼 스택에 들어가는지
아니면 다른 영역에 있는지가 궁금합니다.
스택에 들어간다면 내부적인 참조만 가능하도록 동작하게 하는 것은
컴파일러가 관리하는 것인지 아니면 다른 부분이 담당하는지 알고 싶습니다.

누구냐 넌?

chadr의 이미지

"함수는 호출될 때 활성화 레코드로 스택에 push되는데" 라는 말이 이해가 안되는군요..

"활성화 레코드"라는 용어도 처음들어보고요..
프로세스가 실행이 되면 loader가 코드 부분은 메모리에 복사를 합니다.
이때 그냥 복사하는게 아니라 컴파일러가 지정한 메모리 영역에 매핑되도록 복사를 하게되고..
컴퓨터는 ip를 이용해 다음 명령어를 패치하고 실행하게 됩니다.

이때 함수가 실행이 되어야한다면 일련의 프롤로그과정을 거치고 call 명령을 이용해서
함수를 호출하거나 특수한 경우에는 jmp명령을 이용해서 함수를 호출하게 됩니다.

이때 프롤로그 과정에서 함수를 콜하기 전에 레지스터를 스택에 백업하게 되고, 인자가 필요하는
경우에는 인자를 스택에 푸시하는 경우가 선행 된후 함수를 콜하게 됩니다.

스택에 푸시하는 경우는 이와같이 레지스터와 함수가 사용할 인자의 경우밖에 없는데 "활성화 레코드"
라는 말이 뭔지 궁금하네요..

"static함수는 내부에서만 참조가 가능한데..(뭐 함수 포인터로 어떻게 하면 참조가 가능하긴 하지만)
이런거는 컴파일러가 처리하는 것인지 프로세스내에서 처리하는 것인지도 알고 싶습니다.."

-> 스태틱 함수는 언어상의 문법 구분일 따름입니다. 스태틱 함수의 경우에는 해당 파일 스코프에서만 사용이 가능
하도록 문법에 정의 되어있을 뿐 다른 제약사항은 없습니다. 즉 컴파일러가 처리한다고 생각하시면 됩니다.

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

라키시스의 이미지

Quote:

static함수는 내부에서만 참조가 가능한데..(뭐 함수 포인터로 어떻게 하면 참조가 가능하긴 하지만)
이런거는 컴파일러가 처리하는 것인지 프로세스내에서 처리하는 것인지도 알고 싶습니다..

object 파일 생성시 static 함수는 export 되는 symbol table 에 포함되지 않습니다.
따라서 link 시 해당 static 함수가 포함된 object 파일 외의 파일에서는 참조할 수 없게 됩니다.

plustag의 이미지

chadr님, 라키시스님 답변 감사합니다.
활성화 레코드(activation recode)는 unix system programming 책에 나온 말입니다.
책에서는 리턴주소, 매개변수, 자동변수, 레지스터 값을 활성화 레코드라고 부릅니다.
그러니까 하나의 함수에 대한 리턴값, 인자값, 변수값 같은 것들이 하나의 활성화 레코드라고 하는것 같습니다.
언어하고 하드웨어에 따라 형식이 달라질 수 있다네요..

누구냐 넌?

chadr의 이미지

그렇다면 제가 설명해드린데로 활성화 레코드는 스태틱 함수도 다른 함수와 다를게 없이 똑같이 스택에 푸시가 됩니다.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

댓글 달기

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