gcc 진행 단계
1단계: 전처리
gcc -E main.c -o main.i
- main.i는 전처리 결과물 (모든 #include 파일과 매크로 확장 포함)
2단계: 컴파일
gcc -S main.i -o main.s
- main.s는 어셈블리 코드
3단계: 어셈블
gcc -c main.s -o main.o
- main.o는 목적 파일
4단계: 링킹
gcc main.o -o main
- 실행 가능한 main 바이너리 생성 (기본적으로 C 표준 라이브러리도 링크됨)
링커 역할
GCC는 내부적으로 **ld (GNU linker)**를 호출해서 다음을 수행한다.
- 여러 .o 파일을 하나로 결합
- 필요한 라이브러리 (예: libc) 연결
- 시작 지점 (_start 또는 main) 지정
- 메모리 주소 배치 결정 (기본은 자동이지만, T 옵션으로 ld script 지정 가능)
링커스크립트 컴파일 동작
1. main.c
|
1
2
3
4
5
6
7
8
9
|
// 초기화된 전역 변수 (data segment에 저장됨)
int global_data = 42;
// 초기화되지 않은 전역 변수 (BSS segment에 저장됨, 초기값은 0)
int global_bss;
int main() {
// global_data (42) + global_bss (0) 의 값을 반환
return global_data + global_bss;
|
cs |
2. link.ld
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
ENTRY(_start)
SECTIONS
{
. = 0x400000;
.text : {
*(.text)
}
.data : {
*(.data)
}
.rodata : {
*(.rodata)
}
.bss : {
*(.bss COMMON)
}
/DISCARD/ : {
*(.comment)
}
}
|
cs |
3. 컴파일 및 링크
(1) 목적 파일 생성 (c)
gcc -c main.c -o main.o
(2) 커스텀 링커 스크립트로 링크
ld -T link.ld main.o -o main.elf
4. 결과 확인
readelf -S main.elf
빌드 방법 (GCC 사용, libc 포함)
gcc -T link.ld -o main main.c

'ARM_core 기반 리눅스 BSP 개발 > Raspberry_PI Kernel build' 카테고리의 다른 글
| [Raspberry_PI]_GPIO PIN 제어 (1) | 2025.06.18 |
|---|---|
| [Raspberry_PI]_SDcard_수동Mount (0) | 2025.06.18 |
| [Raspberry_PI]_env_환경 변수 (0) | 2025.06.17 |
| [Raspberry_PI]_time_명령 (0) | 2025.06.17 |
| [Raspberry_PI]_LED_BLINK (0) | 2025.06.17 |