파일 종류
- .c (source file): 소스코드가 담긴 파일
- .i : 전처리가 완료된 소스코드가 담긴 파일
- .s : 소스코드를 어셈블리어로 컴파일한 파일
- .o (object file) : 어셈블리어를 기계어로 컴파일한 파일
- 실행파일 : 목적 파일을 실행 가능하게 만든 파일

전치리기(Pre-processor) : 어셈블리어로 컴파일되기 전에 전처리 지시자를 실행시켜주는 프로그램
- 전처리 지시자 : 컴파일하기 전에 처리되는 작업(전처리)을 나타내는 키워드
ex) #include : 헤더 파일을 현재 소스코드에 포함시켜 주는 지시자
#define : 특정 값 혹은 작업을 하나의 이름으로 설정해주는 매크로를 정의하는 지시자
조건부 컴파일 지시자 : 소스코드를 조건에 따라 선택적으로 컴파일
컴파일러(Compiler) : 컴파일을 실행하는 언어 번역 프로그램
- 컴파일 : 하나의 프로그래밍 언어로 짜여진 코드를 다른 언어로 변환하는 작업 (C언어 → 어셈블리어)

<< 컴파일러 작동 원리 >>
- 어휘 분석(Lexical analysis)
- 구문 분석(Syntax analysis)
- 의미 분석(Semantic analysis)
→ 각 소스 코드의 의미 파악
- 중간 코드 생성
- 코드 최적화(독립적)
→ CPU에 독립적인 최적화를 위해 실행
- 코드 생성(Code generation)
- 코드 최적화(의존적)

어셈블러(Assembler) : 어셈블리어 코드를 기계어 형태의 오브젝트 코드로 해석해주는 언어 번역 프로그램

어셈블리어들이 각 ISA의 명령어 포맷에 따라 기계어로 변환되어 목적 파일 생성
어셈블러 종류
- 단일 패스 어셈블러 : 하나의 명령문을 읽는 즉시 기계어로 번역하여 오브젝트 프로그램을 만듦
- 이중 패스 어셈블러 : 처음부터 끝까지 읽어 1단계의 작업을 수행한 후, 다시 읽으면서 1단계 수행 결과를 사용하여 오브젝트 프로그램을 만듦
- 크로스 어셈블러 : 현재 어셈 블하는 컴퓨터가 아닌 어셈블 된 프로그램을 실행시킬 컴퓨터에 맞게 오브젝트 프로그램 생성

링커(Linker) : 컴파일러가 만들어낸 하나 이상의 오브젝트 파일을 가져와 단일 실행 프로그램으로 병합하는 프로그램
- 링킹 : 만들어진 오브젝트 파일을 다른 오브젝트 파일이나 라이브러리와 연결시켜주는 작업
라이브러리(libary) : 다른 프로그램들과 링크(link) 되기 위하여 존재하는 하나 이상의 서브루틴(subroutine)이나 함수(function)들의 집합 파일
stdio.h : 표준 입출력 함수
string.h : 메모리와 문자열의 처리
ctype.h : 문자 검사 및 변환
math.h : 수학 함수
stdlib.h : 메모리 동적 할당, 가상 난수 발생, 문자열 변환
malloc.h : 메모리 할당에 관련된 함수
time.h : 날짜와 시간 그리고 내부 클럭
- Dynamic Link(동적 링크) : 실행 단계에서 라이브러리나 다른 오브젝트 파일이 연결됨
- Static Link(정적 링크) : link 단계에서 라이브러리나 다른 오브젝트 파일을 바이너리에 포함 시킴
pwndbg 명령어
r : 실행
ctrl + c : 실행 중단
disassemble [함수명] : 함수 디스어셈블 목록 확인
b(break) [함수명/주솟값] : break point 걸기
del : break ponit 삭제
ni : 한 줄씩 코드 진행 (call 함수 내부는 건너뜀)
si : call 함수 내부까지 한 줄씩 진행
'Layer7' 카테고리의 다른 글
| Assembly X86 Stack 관리 (1) | 2021.05.24 |
|---|---|
| Assembly X64 (0) | 2021.05.22 |
| C Pointer (1) | 2021.05.11 |
| embedded(임베디드) (3) | 2021.04.20 |
| Pipelining : Hazard (2) | 2021.04.17 |