C 컴파일&링킹 후 만들어진 바이너리가 실행되는 원리는 무엇인가요?
글쓴이: boy0226 / 작성시간: 화, 2009/01/20 - 4:51오후
정확한 용어를 잘 몰라 질문을 이상하게 한 점 죄송합니다.
본론으로 들어가면
#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
힙 영역 : 없음
그렇다면 바이너리 실행 시에는 어떠한 순서 및 원리로 실행 되나요?
Forums:
일반적으로 Loader
일반적으로 Loader 라는 놈이 파일 형식에 맞게 메모리에 올립니다.
보통
코드영역
DATA영역
그리고 프로세서에게 할당된
Stack 영역 등이 있습니다.
그리고 실행을 코드영역으로 옮겨주면 프로그램이 실행이됩니다.
=========================
CharSyam ^^ --- 고운 하루
=========================
=========================
CharSyam ^^ --- 고운 하루
=========================
ABI를 읽어보시면
ABI를 읽어보시면 참고가 되실듯 하네요.
Low Level에 관심이
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 함수 실행
#include #include #include
charsyam님, SoulreaveR님, okdongil님 가르침 감사합니다.
추천해주신 책 잘 볼께요...^^
에라이디여~ 초급 산을 넘어라~
인용:코드영역 : 위의
Data 영역은 대채로 전역변수들이 저장되고,
stack에 지역변수와 함수 수행후 돌아갈 주소, 리턴값들이 저장됩니다.
Stack에 대해 자세히 알려면
http://www.intel.com/products/processor/manuals/
IA-32 basic architecture(?)를 보시는 것도 좋을것 같습니다.
물론 영어의 압박이 있지만요 ^^
댓글 달기