ARM_core 기반 리눅스 BSP 개발/Raspberry_PI Kernel build

[Raspberry_PI]_Linker_Script

juniha 2025. 6. 17. 20:35

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