리눅스 Gcc(Gnu C cimplier) : GNU시스템의 공식 컴파일러
- 윈도우 환경에서는 visual studio, Dev C++ 에서 C언어로 코드를 작성 후, 그안에 컴파일을 통해 실행파일인 확장자exe 생성이 되어 실행이된다.
하지만 리눅스에서는 vi편집기를 통해서 C코드로 작성하여 Gcc를 통해서 컴파일을 하여 실행파일을 생성하여 프로그램을 실행할 수 있다.
소스코드(.c)를 vi를 통해서 C언어로 소스코드 작성.
(1)컴파일 과정.
1.전처리(Preprocessing) : 입력 데이터를 처리하여 다른 프로그램에 대한 입력으로서 사용되는 출력물을 만들어내는 프로그램이다.
- 전처리 후 소스(.i) - 전처리가 끝이 나면 확장자가 i인 파일이 생성

2. 컴파일 : 기계어와 가장 유사한 형태인 어셈블리어로 변환 한다.
- 파일의 확장자( .s ) s를 가진 파일이 생성.

3. 어셈블리 : 2진수로 이루어진 기계어로 된 파일이 생성
- 파일의 확장자자( .o ) o인 파일이 생성.

4. 링커 : 목적파일과 실행에 필요한 라이브러리들을 하나로 묶어준다.
- 실행파일(.exe) : 링크에 의해 실행 할 수 있는 파일을 생성.
- 리눅스에서는 컴파일 할 때 이름을 지정할 수 있다. 이름을 지정하지 않은경우 보통 알파벳으로 실행파일이 나온다. (알파벳순서로 나오는건지 아니면 랜덤하게 나오는건지는 모르겟다.)
(2)objdump
- 하나 이상의 목적 파일의 정보를 화면에 표시하는 프로그램.
- Disassemble이 가능하다.
- 오프젝트 파일들의 내용을 읽을때 BFD라이브러리를 사용한다.
형식
- objdump [option] [filename]
옵션
- f : 파일포맷, 아키텍쳐, 플래그, 시작주소에 대한 정보가 출력.

- d : 파일 실행 영역이 디스어셈블되어 출력

- h : 섹션 헤더의 정보를 출력

(3) 간단한 C소스코드 만들어서보기

당연히 Hello,World!!!가 출력되는 것은 누구가 다 아는 것이다.
그럼 컴파일 하는동안 어떤 파일이 만들어지고 그러한
과정을 보기 위해서는 "gcc -v hello.c" 또는 "gcc -v -save-temps"와 같은 명령어로 하면 컴파일 과정을 볼 수 가 있다.

그후 디렉토리 안에 있는 파일을 보면 컴파일을 통해 각각 만들어진 임시 파일 및 실행 파일까지 볼 수 가 있다.

그래서 실행파일인 hello파일이 어떻게 되었는지 xxd 와 objdump를 통해 알아보도록 했다.
먼저 objdump를 먼저 봤다. (objdump -d hello)

많은 내용이 나오지만 main부분을 봤다. 그후 xxd로도 봤다.

파일을 보면 왼쪽에는 메모리 주소이다.(보통 파일구조 그대로 메모리로 올라가기 때문)
대략 뒤 3자리를 참조 하면된다.
그래서 3d0를 확인해보았다.
3d0위치를 우리가 확인했던 바이너리 문자로도 볼 수 있다.
이어서 어셈블리어로 똑같은 기능하는 프로그램을 만들어 보기로 했다.
우선 hello.o파일을 어떻게 되어있는지 확인을 해보았다.

각각의 Section(segment) 단위로 나누어져 있는것을 알 수가 있다.
이와 마찬가지로 어셈블리어로 코딩을 할 때 도 나누어져야 된다.
각각 Section 설명
1) text Section : 실행코드
2) data Section : 초기화된 데이터 영역
3) bss Section : 비초기화된 데이터 영역
- 지역변수는 파일안에 포함을 안시킨다.
* 지역변수는 함수가 실행되야 실행되기때문.
어셈블리 코딩하는법
1. C표준 라이브러리를 이용한작성
2. assemble함수를 사용하지 않고 화면에 출력.
작성법은
segment .data
; .data segment에 들어갈 내용들 ..
segment .bss
; .bss에 들어갈 내용들
segment .text
global main; gcc를 사용하기 위해서 선언
; .text에 들어갈 내용(실행문장)...
첫번째 방법작성한 어셈블리 코딩

컴파일 방법은 "nasm -f elf hello1.asm -o hello1.o" 이걸 통해서 목적파일을 생성하고, C컴파일러인 "gcc -o hello1 hello1.o" 통해서 실행파일을 생성한다.
실행파일을 실행하면 세그먼테이션 폴트가 난다. 이유가 들어보니 리턴문이 없어서 그런거라고 들었다.

두번째 방법으로 코딩을 해본것이다.

컴파일 하는 방법만 다르지 결과는 똑같았다.
nasm -f elf hello2.asm -o hello2.o
ld -o hello2 hello2.o