최근 C언어로 된 Source File(.c)를 가지고 Compile하여 Object File(.o)을 확인해 볼 기회가 있었다.

link까지 한 후의 executable ELF까지는 아직 확인해보지 못했지만 ㅠ(곧 도전해봐야지!)

암튼 Object 파일(relocatable ELF)과 Object 파일을 disassemble한 .s 파일을 까봤을 때, 뭔지 보기가 어려웠어서

Source File부터 Compile/Assemble이 어떻게 진행되고 파일의 구조가 어떻게 이루어지는지 공부해보고 싶어졌다. 

 

- Compiling/Assembling

흔히 Compile이란 우리가 C, C++과 같이 High Level 언어로 작성한 것을

0과 1밖에 모르는 컴퓨터가 알아볼 수 있도록 Low Level 언어로 바꿔주는 것을 말한다.

전체 Flow를 보게되면 다음과 같다. 

Compiling Flow

 

흠,, 정리해보면

① C파일을 Compile하여 Assembly File로 만들고, 이를 Assemble하여 Object File로 만든다.
그리고 복잡한 System에서 C파일 하나에 모든 것을 몽땅 담을 수 없기에 여러 C파일을 Source로 하는데

이렇게 ② 각각의 C파일에서 나온 Object File 을 Linker로 Link해준다.

Link 결과 ③ .ELF File이 나오고 이를 Binary Code로 변환하는 것이다.

 

참고로 위에서 나눠놓은 Compile과 Assemble은 보통 gcc, armcc와 같은 Compiler에서 한번에 처리한다.
즉, Compiler에 .c파일을 넣으면 .o파일이 나온다.

또 하나, 참고로 우리가  Assembly Code를 확인하며 Debugging할 때는 .s File을 이용해야 하기에
이 Object file을 Disassemble하여 검증을 진행하게 된다.

 

암튼 .c나 .cpp 같은 Source File이나 Assembly File은 익숙하고 눈으로 볼 수 있지만 

이후 Object File부터는 사람이 무엇인지 알아볼 수가 없었기 때문에 이 부분에 대해 살펴보고자 한다.

 

- Object file (Relocatable ELF)

Object file(.o)

위 사진은 Ubuntu환경에서 .o file을 읽어본 결과이다.

Object file을 까보면 위와같이 사람이 알 수 없는 숫자들이 마구 나열되어 있다. 

써져있는 부분들의 자세한 내용은 따로 공부하여 포스팅해보도록 하고 이번 포스트에서는 개념적인 부분을 이해하려고 한다.

 

그럼 Assembler의 결과물, Object파일이 Executable ELF과 구별되어 Relocatable ELF로 불리는 이유가 뭘까?

말그대로 실행가능(Executable)한 것은 아니고 재배치(Relocatable)할 수 있는 File이라는 의미이다.

즉, 지금은 .c파일로부터 .o로 컴파일(어셈블)만 해 놓은 것이고

추후 link를 통해 실행가능한 파일로 만들 때, 재배치가 되어야한다는 것이다.

Relocatable ELF Format

"임베디드 레시피"님 블로그를 통해 확인한 일반적인 ELF File Format은 위와 같다. 

 

각 Section들을 보게되면 다음과 같다.

1) .text : compile된 기계어(opcode) 포함

2) .rodata : read-only data

3) .data : 초기화된 전역 변수

4) .bss : .data와 비슷하지만 분리해놓은 이유는 초기화되지 않은 전역변수가 들어가기 때문

5) .symtab segment : symbol table

* symbol : 실제 주소를 가질 수 있는 단위로 보통 전역변수의 이름이나 함수이름

6) .rel.text :  relocatable text

7) .rel.data : 현재 파일에서는 정의되어 있지 않고 link시 참조되는 전역 변수에 대한 재배치 정보를 담고 있다. 

(* 현재 파일이 아닌 다른 파일에 선언된 변수를 사용할 때, extern을 선언하고 해당 변수를 쓰게 된다.

그러면 link시 linker가 extern 구문을 보고 해당 변수가 다른 파일에 있다는 걸 알아채고 연결시켜 준다.)

 

나머지 .debug, .line, .strtab은 debug시 사용되는 section들 같은데 아직은 잘 이해를 하지 못했다 :(

암튼, Relocatable ELF File이 어떤 Section들로 분류가 되어있고 각 Section에 무슨 정보들이 포함되는지 확인할 수 있었다.

 

- Object file (Executable ELF)

이후에 앞서 정리한 Relocatable ELF 파일들을 linker가 link를 시켜주게 되면 비로소 실행할 수 있는 Executable ELF 파일이 나타난다.

Executable ELF

색깔을 보면 알 수 있듯이 여러개의 Relocatable ELF 파일(.o)에서 같은 속성의 Section들을 잘 모아서

위와 같은 Executable ELF 파일의 Segment를 구성하게 되는 것이다. 

 

당연히 빠뜨린 내용, 부족한 내용이 분명 존재할테지만 컴파일의 전체적인 흐름에 대해서는 어느정도 정리가 된 것 같다.

 

전체적인 컴파일링 과정과 파일 포맷을 살펴봤으니
어제와 똑같은 파일들을 내일 본다면 안보였던 무언가가 더 보이지 않을까 기대해보면서 포스팅을 마친다 :)

 

 

 

출처 : 임베디드 레시피님 블로그, http://recipes.egloos.com/5011946

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기