C 컴파일&링킹 후 만들어진 바이너리가 실행되는 원리는 무엇인가요?

boy0226의 이미지

정확한 용어를 잘 몰라 질문을 이상하게 한 점 죄송합니다.

본론으로 들어가면

#include

void print (void)
{
char ch[10]="Hello";

printf ("%s\n", ch);
}

int main (int argc, char **argv)
{
print ();

return 0;
}

위와 같은 프로그램을 컴파일&링킹 후 바이너리가 만들어지면 아래와 같은 구조로 만들어

진다고 생각됩니다.

코드영역 : 위의 코드가 들어갈 것이고
DATA영역 : print()함수 실행 후 복귀할 주소
스택영역 : main (), print (), ch
힙 영역 : 없음

그렇다면 바이너리 실행 시에는 어떠한 순서 및 원리로 실행 되나요?

charsyam의 이미지

일반적으로 Loader 라는 놈이 파일 형식에 맞게 메모리에 올립니다.

보통

코드영역
DATA영역

그리고 프로세서에게 할당된
Stack 영역 등이 있습니다.

그리고 실행을 코드영역으로 옮겨주면 프로그램이 실행이됩니다.

=========================
CharSyam ^^ --- 고운 하루
=========================

=========================
CharSyam ^^ --- 고운 하루
=========================

SoulreaveR의 이미지

ABI를 읽어보시면 참고가 되실듯 하네요.

okdongil의 이미지

Low Level에 관심이 많으시네요.
Low Level이 전 재미있더라구요.
위의 내용은 여기에 설명하기는 양이 너무 많고요.

Linker & Loader라는 책이 있는데요. 그 책을 보시면 많은 도움이 되실 거 같구요
ELF, PE File Format, Linker Script 같은 것을 이해하시면
먼가가 보이실 겁니다.

간단한 예를 들면
1. Code 영역의 가장 처음 부분에 entry함수를 위치
2. Binary를 Code, Data, ZI에 맞게 메모리에 위치
3. 메모리의 처음 위치로 Jump, code 실행
4. entry 함수는 결국 main 함수 실행

boy0226의 이미지

charsyam님, SoulreaveR님, okdongil님 가르침 감사합니다.

추천해주신 책 잘 볼께요...^^

에라이디여~ 초급 산을 넘어라~

kkmin의 이미지

Quote:
코드영역 : 위의 코드가 들어갈 것이고
DATA영역 : print()함수 실행 후 복귀할 주소
스택영역 : main (), print (), ch

Data 영역은 대채로 전역변수들이 저장되고,
stack에 지역변수와 함수 수행후 돌아갈 주소, 리턴값들이 저장됩니다.

Stack에 대해 자세히 알려면
http://www.intel.com/products/processor/manuals/
IA-32 basic architecture(?)를 보시는 것도 좋을것 같습니다.
물론 영어의 압박이 있지만요 ^^

댓글 달기

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