C 언어 컴파일 과정


Compile

원시 프로그램은 컴파일러를 통해 오브젝트 파일(목적프로그램)로 바꿔진다.

이 단계에서 아래와 같은 절차가 이뤄진다.

 

- 만약 원시프로그램 이름이 a.c라면 a.c에 대하여 전처리기(preprocessor)를 수행시키고, 그 결과를 전처리된 임시파일에 저장한다.

   # cpp [other-command-line options] a.c /tmp/a.i

 

- a.i에 대하여 컴파일러를 수행시키고, a.s라는 어셈블러 코드를 생성한다.

# cc1 [other-command-line options] /tmp/a.i -o /tmp/a.s

 

- a.s에 대하여 어셈블러를 수행시키고, a.o라는 오브젝트 파일을 생성한다.

# as [other-command-line options] /tmp/a.s -o /tmp/a.o

 

cpp, cc1, as GNU의 전처리기, 컴파일러, 어셈블러를 각각 나타내며, GCC 배포본 안에 들어있다.

 

Linking

오브젝트 파일을 필요한 라이브러리와 연결시켜(링크) 컴퓨터가 알 수 있는 기계어로 바꾼다. 그러면 실제로 실행 가능한 파일을 생성하게 된다.

 # ld [other-command-line options] /tmp/a.o -o a.out

 

리눅스의 gcc는 컴파일 시 자동으로 링크까지 수행한다. 생성된 실행 파일은 리눅스의 경우 특별히 이름을 지정하지 않으면 a.out라는 이름이 만들어진다.

 

최종적으로 만들어진 실행파일(a.out)은 이제 로드 될 준비가 되었다. 이것을 실행시키기 위해서 우리는 쉘 프롬프트 상에서 아래와 같이 타이핑한다.

 # ./a.out

 

그러면 쉘은 로더를 불러 a.out의 코드와 데이터를 메모리로 복사하고, 프로그램내의 제일 처음으로 제어권을 넘긴다. 여기서 말하는 로더는 execve라는 것으로 실행 가능한 오브젝트 파일의 코드와 데이터를 메모리로 로드하고 그 프로그램의 첫번째 명령어가 저장된 주소로 점프함으로써 프로그램을 수행하게 한다.

a.out이라는 명칭은 a.out 오브젝트 파일들 안에 있는 어셈블러의 출력물에서 그 유래를 찾을 수 있다. 그 이후로 오브젝트 형식은 다양하게 바뀌어 왔지만, 그 이름은 계속 사용 되어지고 있다.

'Development > C' 카테고리의 다른 글

심볼 테이블 (Symbol Table)  (0) 2012.01.31
프로그래머 10계명  (1) 2011.09.25
심볼 테이블  (0) 2011.07.31
toolchain 이란  (0) 2011.02.12
C - 문자 '0'과 문자 '\0'의 차이 그리고 NUL과 NULL의 차이  (0) 2011.02.12
Posted by linuxism
,

toolchain 이란

Development/C 2011. 2. 12. 14:11

tool chain 이란 embedded system에서 자주 사용되는 말로

 

"원하는 Target System의 소프트웨어 개발을 하기 위한 Host System Compile 환경"을 의미합니다.

 

여기서 Compile 환경은 주로 Target Host가 다르기 때문에 흔히

크로스-컴파일 환경이란 말로 사용됩니다만 꼭 Target Host System이 다를 필요가 없기 때문에 그냥 Compile 환경이라고 했습니다.

 

질문자님의 경우를 보면 우선

 

Target System : Windows 환경

Host System : Windows 환경

 

입니다. 그러니까 Target System Host System 이 같은 경우입니다.

 

이제 부터 Compile 환경에 대해 이야기 해 봅시다.

 

얼핏 Eclipse가 컴파일러 같지만 사실 Eclipse Java 용 컴파일러만 내장하고 있고C++는 컴파일러가 내장되어 있지 않습니다.

그렇기 때문에 Eclipse C++ 를 컴파일 하고 싶다면 컴파일러를 설정하여 주어야 합니다.

여기에 단순히 하나의 컴파일러만 사용되는 것이 아니라 일반적으로

 

컴파일러

링커

바이너리 변환기(bin2exe, binutils 같은 프로그램)

 

등이 사용되고 이 Tool 들이 연속적으로 사용되기 때문에(컴파일한 후 링크하고

바이너리로 변환) chain 으로 불립니다.

 

Eclipse로 프로그램을 작성하지만 Eclipse에서 제공할 수 있는 것은 Edit 기능과 Project관리 기능 및 Tool chain 들의 사용법대로 호출해주는 것만 할 수 있지요.

 

우선 대부분의 프로그래머들이 Eclipse C++ 컴파일러로 gcc를 사용합니다.

gcc를 사용해서 컴파일한 후에 링크하고 binutils 같은 프로그램으로 윈도우즈용 실행 파일인 .exe 파일을 만드는 것이죠.

 

일반적으로 이 일들을 한 번에 해주는 tool이 바로 MinGW CygWin 입니다.

복잡한 Tool chain이 필요없이 MinGW CygWin 만 있으면 바로 소스코드에서

윈도우즈용 .exe 파일을 만들 수 있는 것이죠.

 

eclipse에서 C++를 사용하기 위해서는 우선 맨 먼저 해야 할 일이 이 Tool chain을 먼저 선택해서 설치를 해야 합니다. 왜냐하면 eclipse 자체에서는 C++ 컴파일 환경을 가지고 있지 않다고 했죠!

 

CygWin  http://www.cygwin.com

MinGW  http://www.mingw.org

 

에서 다운로드 가능합니다. 당연히 모두 Open source입니다. 저는 mingw를 추천하지만 cygwin도 똑 같이 아무 문제 없이 윈도우즈용 프로그램을 만들 수 있습니다.

 

여러 가지(컴파일러-링크-binutil)가 있어 Tool chain 이라고 했지만 mingw cygwin은 하나만 설치하면 안에 다 있어서 간단해서 좋습니다.

 

그 다음 eclipse CDT를 설치합니다. 아마도 질문자께서는 이미 CDT는 설치하지 않았나 싶습니다. 현재 CDT 4.0이 나와 있습니다. CDT eclipse에서 C/C++를 개발하는 데 필요한 Plug-in입니다.

 

설치파일 다운로드

http://www.eclipse.org/cdt/downloads.php

 

간단한 도움말

http://help.eclipse.org/help33/index.jsp?topic=/org.eclipse.cdt.doc.user/concepts/cdt_c_whatsnew.htm

 

그리고 eclipse에서 C/C++를 개발하려면 make utility의 사용법을 조금 배우는 것이 좋습니다. makefile이 필요 없는 프로젝트를 만들 수도 있지만 아무래도 make 를 쓸 줄 모르면 낭패를 당하기 쉽습니다.

 

 

xtelite 

파워 

식물신

 

채택 2059 (89.7%)

http://kinimage.naver.net/storage/userfiles/42/38/xtelite.png

http://blog.naver.com/xtelite

 

'Development > C' 카테고리의 다른 글

심볼 테이블 (Symbol Table)  (0) 2012.01.31
프로그래머 10계명  (1) 2011.09.25
심볼 테이블  (0) 2011.07.31
C 언어 컴파일 과정  (0) 2011.02.20
C - 문자 '0'과 문자 '\0'의 차이 그리고 NUL과 NULL의 차이  (0) 2011.02.12
Posted by linuxism
,
C에서 문자 '0'과 문자 '\0'의 차이
문자열을 표현할 때는 문자열의 끝을 의미하는 문자 하나를 마지막에 삽입한다.
  
문자열의 끝을 의미하는 문자(\0)는 문자열에 일반적으로 등장하지 않는다는 조건을 만족해야 한다(억지로 넣는 것까지 막을 순 없다). 그래야 그 문자를 만나면 100% 문자열의 끝이라는 것을 알 수 있기 때문이다. 

문자 '\0'을 문자열 끝을 나타내는데 사용하며, 이 문자를 가리켜 널(null)문자라 하며, 아스키 코드 값 0에 해당한다. 그리고 symbol은 NUL이다(NULL과 구별하자).

문자 '0'은 아스크 코드 값이 48이다. '\0'과는 반드시 구별하자.

따라서 끝을 나타내기 위해서 모든 문자열의 끝에는 널(null)문자가 자동 삽입된다.

"hello"라는 문자열의 사이즈는 널문자까지 포함하여 6byte가 된다.

NULL은 매크로형이며, (void *)0 으로 선언되어 있다. 
이것은 포인터에서만 사용해야지 다른곳에 사용하면 문제를 야기할수 있다. 
값이 0이라기보다 아무것도 가리키지 않는다는 표현이 맞다.

'Development > C' 카테고리의 다른 글

심볼 테이블 (Symbol Table)  (0) 2012.01.31
프로그래머 10계명  (1) 2011.09.25
심볼 테이블  (0) 2011.07.31
C 언어 컴파일 과정  (0) 2011.02.20
toolchain 이란  (0) 2011.02.12
Posted by linuxism
,