Linux 개발 환경
Build
source code -> binary(excutable)
Host
빌드 진행 환경
Target
빌드된 바이너리가 동작할 환경
타겟마다 바이너리가 다름(C경우 플랫폼 의존성)
Toolchain
원하는 타겟에 맞춰서 빌드해주는 개발 도구 모음
- Compiler: 소스코드 -> 바이너리 (.c -> .obj)
- Library: 함수 모음 (SDK)
- Linker: .obj들, 라이브러리들을 모아 하나의 바이너리로 결합
C 런타임 (CRT, C Runtime)
C언어 main에 이르기까지의 초기화 작업
- OS마다 환경변수, 파라미터 다루는 방식 초기화 방식 등이 다름
- 근데 main()의 형식은 같음 -> 어떻게?
- C Runtime obj파일이 이런 작업들을 해주고 -> main호출
라이브러리
개발자가 직접 작성한 함수 아님, 거의 라이브러리 참조함
C언어의 기본 함수 libc라는 라이브러리 참조
기본위치 (작성자 컴은 Arm이다. x86기반은 또 다를 것임)
/usr/lib/aarch64-linux-gnu
대표적인 라이브러리
- libm: math.h, 수학 관련
- libz: 압축 관련, zlib.h
- libpthread: 스레드 관련, pthread.h
- libstdc++: C++기본 라이브러리
라이브러리 링킹해서 실행파일
main.c
distance.c
distance.h
가 있다고 가정
distance.h에는 pow와 sqrt함수를 사용한다.(math.h를 include해야함)
gcc -c \*.c: 모든 C파일 컴파일해서 .obj파일로 생성- main.o, distance.o가 생성됨
ld *.o /usr/aarch64-linux-gnu/crt1.o -lm -lc: libc와 libm라이브러리 지정, C Runtime 목적파일 링킹- a.out 생성됨
빌드 시스템
- Makefile: 가장 많이 쓰임
- CMake: CMakelists.txt로 작성하며, Makefile로 번역되어 사용
- Ninja
Makefile
- Target 생성하고자 하는 것
- 맨 앞에 작성, :(콜론)으로 의존성 구분
- .PHONY 로 지정
- Dependency 필요한 것
- :(콜론)뒤에 여러개 나열하며 comma(,)로 각각 구분
- Command 해야하는 것
- shell 스크립트 형식으로 작성
- 한줄이 하나의 프로세스
Example
executable: distance.o main.o
ld *.o /usr/aarch64-linux-gnu/crt1.o -lm -lc
distance.o: distance.c
gcc -c -o distance.o distance.c
main.o: main.c
gcc -c -o main.o main.c
- distance.o 와 main.o를 링킹해서 실행파일 생성
- distance.o를 만들기위해 distance.c를 사용
- main.o를 만들기위해 main.c사용
'Linux' 카테고리의 다른 글
| OS 기초 이론 (0) | 2025.07.23 |
|---|---|
| Rootfs와 Kernel 빌드 (feat Makefile) (0) | 2025.07.21 |
| Arm 어셈블리 명령어 간단 소개 (0) | 2023.08.10 |
| Arm프로세서와 Arm아키텍쳐 (0) | 2023.08.09 |
| 프로젝트 단계 별 시스템 소프트웨어 개발 과정 정리 (0) | 2023.08.09 |