[GCC의 개념]
GCC는 GNU 컴파일러 모음(GNU Compiler Collection)의 약자이다. GNU 프로젝트의 일환으로 개발되어 널리 쓰이고 있는 오픈소스 컴파일러이다. 유닉스/리눅스 계열 플랫폼의 표준(사실상) 컴파일러라고도 볼 수 있다.
GNU: GNU's not UNIX, 리처드 스톨먼이 각종 자유 소프트웨어들이 작동되고 널리 퍼질 수 있는 생태계를 구축하기 위해 시작한 프로젝트이다.
GCC에는 C, C++, Objective-C, Fortran, Ada, Go, D, libstdc++와 같은 라이브러리 언어 등이 포함되어 있다.
<MinGW>
Minimallist GNU for Windows, 윈도우용 포크. 여러 오픈 소스 프로그램들을 윈도우에서 돌아가게 하는 데 일조한다.
MinGW는 MSYS(Minimallist SYStem)과 함께 구동되는데, 윈도우에서의 유닉스 터미널 환경을 제공해준다. 윈도우 환경을 그대로 유지하되 리눅스 명령어만 사용해야 할 경우(오픈 소스 라이브러리를 빌드할 때) 유용하게 쓰인다.
<4단계 컴파일 과정>
- 전처리 단계(gcc -E main.c -o main.i)
- 컴파일 단계(gcc -S main.i -o main.s)
- 어셈블 단계(gcc -c main.s -o main.o -> hexdump main.o)
- 링크 단계(gcc main.o -o main.exe)
.c
C언어의 소스코드 파일.
.i
전처리 단계를 거친 C파일
.s
컴파일 단계를 거친 어셈블리어 파일
.o
어셈블 단계를 거친 오브젝트 파일
.exe (a.out - linux)
링크 단계를 거친 실행파일
+) .a(archive - 정적 라이브러리) / .so(shared object - 공유 라이브러리)
<비트 연산 내장 함수>
C/C++의 기능이 아닌 컴파일러 자체의 기능이다. 아래 함수들은 모두 unsigned int(32bit)를 기준으로 작동하며, unsigned long long 타입을 쓸 땐 함수 이름 뒤에 ll를 붙여주면 된다.
1. __builtin_popcount: 비트의 개수를 반환한다. (__builtin_popcount(n))
2. __builtin_ctz: 오른쪽 0의 개수를 반환한다.(__builtin_ctz(n))
3. __builtin_clz: 왼쪽 0의 개수를 반환한다. (__builtin_clz(n))
참고자료
'System & Reversing > 필기' 카테고리의 다른 글
x86, x64 차이점 및 구분 (0) | 2023.03.16 |
---|---|
아키텍처의 개념, 종류, 특징(+ CPU 아키텍처) (0) | 2023.03.11 |
dll 파일이란? (+ lib과의 차이점) (0) | 2023.03.10 |
어셈블리 핸드레이와 함수 프롤로그/에필로그(+ 스택 프레임) (0) | 2023.03.10 |
메모리 구조 (+ 일반PC, 임베디드 시스템) (0) | 2023.03.10 |