C 소스 파일을 컴파일하면 object 파일 (*.o) 가 생성된다. 보통은 -c 옵션을 생략하기도 하고, Makefile에서 생성되긴 하지만 별 관심없이 그냥 넘어가곤 한다. 갑자기 object 파일 안에는 무슨 내용이 있을까 궁금해져서 역시나 형님께 여쭤봤다.

먼저, 아래 캡쳐 그림은 object 파일들을 각각 다른 컴파일러로 컴파일한 내용이다. 첫번째 그림은 gcc 로 컴파일한 결과이다.

gcc

 

아래 그림은 arm-none-eabi 컴파일러로 object를 생성한 결과이다.

arm-none-eabi

 

C 소스 코드를 컴파일하여 생성된 **Object 파일(객체 파일)**에는 컴파일된 바이너리 코드와 함께 프로그램 실행에 필요한 다양한 메타데이터가 포함됩니다. Object 파일은 기계어 코드로 변환된 **섹션(section)**과 심볼(symbol) 정보를 포함하며, 이 정보는 링크 단계에서 사용됩니다.


Object 파일의 구성 요소

1. 헤더(Header)

  • Object 파일의 기본 정보를 포함.
  • 파일 형식(예: ELF, COFF, PE), 아키텍처, 엔디안, 버전 정보 등을 정의.

헤더에 포함된 정보:

  • 파일 타입: 실행 파일, 재배치 가능 파일(Object 파일), 공유 라이브러리 등.
  • 아키텍처: 타겟 CPU(예: x86, ARM).
  • 엔디안: Little-endian 또는 Big-endian.
  • 섹션 오프셋: 각 섹션의 시작 위치.

2. 섹션(Sections)

Object 파일은 여러 섹션으로 나뉘며, 각각 특정 유형의 데이터를 포함합니다.

주요 섹션:

  1. .text
    • 기계어 코드(실제 실행되는 코드)를 포함.
    • 읽기 전용.
    • 예: 함수의 기계어 명령어.
  2. .data
    • 초기화된 전역 및 정적 변수를 포함.
    • 읽기 및 쓰기 가능.
    • 예: int x = 10;
  3. .bss
    • 초기화되지 않은 전역 및 정적 변수를 포함.
    • 파일 크기를 줄이기 위해, 메모리에서만 초기화됨(값은 0으로 초기화).
    • 예: int y;
  4. .rodata
    • 읽기 전용 데이터(예: 상수, 문자열 리터럴)를 포함.
    • 예: const char *str = "Hello";
  5. .rel.text / .rela.text
    • 재배치 정보. 링크 시 동적으로 주소를 수정하기 위해 사용.
  6. .symtab
    • 심볼 테이블. 함수, 변수, 객체 등의 심볼 정보를 포함.
  7. .strtab
    • 심볼 이름을 저장하는 문자열 테이블.

3. 심볼 테이블(Symbol Table)

  • Object 파일에 정의된 함수 및 변수의 이름과 위치 정보를 포함.
  • 각 심볼에는 다음과 같은 정보가 포함됩니다:
    • 이름: 변수나 함수의 이름.
    • 섹션: 심볼이 속한 섹션(예: .text, .data).
    • 주소: 심볼의 시작 주소.
    • 유형: 함수, 변수, 재배치 심볼 등.

4. 재배치 정보(Relocation Entries)

  • Object 파일의 주소를 재배치하는 데 필요한 정보.
  • 링크 시, 다른 오브젝트 파일이나 라이브러리의 주소와 결합하여 올바른 실행 파일을 생성.

주요 항목:

  • 심볼 참조: 외부 또는 내부 심볼 참조.
  • 오프셋: 수정해야 할 메모리 주소.
  • 재배치 유형: 수정 방법(절대 주소, 상대 주소 등).

5. 디버그 정보(선택적)

  • 디버깅 도구(GDB 등)에서 사용되는 추가 정보.
  • 컴파일 시 -g 옵션을 활성화하면 생성.
  • 주요 구성:
    • 소스 코드와 바이너리 코드 간의 매핑 정보.
    • 함수 이름, 변수 이름, 파일 라인 번호 등.

Object 파일의 실제 예시

1. 컴파일

다음 C 코드를 gcc -c example.c 명령으로 컴파일하면 Object 파일이 생성됩니다.

// example.c
#include <stdio.h>

int x = 10;
const char *message = "Hello, World!";

void printMessage() {
    printf("%s\n", message);
}

2. Object 파일 분석

readelf 명령어를 사용하여 Object 파일을 분석할 수 있습니다.

헤더 정보:

$ readelf -h example.o
ELF Header:
  Class:                             ELF32
  Data:                              2's complement, little endian
  Type:                              REL (Relocatable file)
  Machine:                           ARM

섹션 정보:

$ readelf -S example.o
Section Headers:
  [Nr] Name              Type             Address          Offset
  [ 0] .text             PROGBITS         00000000         0x0000
  [ 1] .data             PROGBITS         00000000         0x0040
  [ 2] .bss              NOBITS           00000000         0x0050
  [ 3] .rodata           PROGBITS         00000000         0x0060
  [ 4] .symtab           SYMTAB           00000000         0x0080
  [ 5] .strtab           STRTAB           00000000         0x00c0

Object 파일의 링크 과정

  1. 개별 Object 파일 생성:
    • 소스 파일을 컴파일하여 각각의 Object 파일 생성.
  2. 링커(Linker):
    • 여러 Object 파일과 라이브러리를 결합하여 실행 파일 생성.
    • 재배치 정보를 사용하여 심볼을 올바르게 연결.
  3. 실행 파일 생성:
    • 최종적으로 실행 가능한 바이너리 파일 생성.

결론

Object 파일은 다음과 같은 요소로 구성됩니다:

  • 헤더: 파일 정보.
  • 섹션: .text, .data, .bss 등 프로그램 데이터.
  • 심볼 테이블: 함수와 변수의 이름 및 위치 정보.
  • 재배치 정보: 링크 시 주소 수정에 필요한 정보.

Object 파일은 컴파일된 코드와 프로그램 실행에 필요한 메타데이터를 포함하여, 링커가 실행 파일을 생성하는 데 필요한 중요한 역할을 합니다. 

'C' 카테고리의 다른 글

길이가 0인 배열  (0) 2025.04.15
나만의 assert 만들기  (0) 2025.04.14
세그먼트  (0) 2023.04.13
Why is the number of array elements smaller than minus value?  (0) 2023.04.06
array length as parameter  (0) 2022.11.09

Cortex-R5 를 QEMU로 에뮬레이션 하려고 자료를 찾는 도중, DTB 파일이란 내용이 있어 기록한다.

 

DTB(Device Tree Blob) 파일은 디바이스 트리(Device Tree) 데이터를 바이너리 형식으로 저장한 파일입니다. 디바이스 트리는 하드웨어 구성을 설명하는 데이터 구조로, 특히 임베디드 시스템 Linux 커널에서 널리 사용됩니다. DTB 파일은 운영 체제 또는 부트로더가 하드웨어 정보를 동적으로 읽을 수 있도록 설계되었습니다.


디바이스 트리(Device Tree)란?

디바이스 트리는 하드웨어의 구성 요소와 연결 관계를 설명하는 데이터 구조입니다. 하드웨어 정보를 소스 코드에 직접 하드코딩하는 대신, 별도의 데이터 파일로 관리하여 더 유연한 하드웨어 지원을 제공합니다.

디바이스 트리의 역할

  1. 하드웨어 정보 제공:
    • CPU, 메모리, 인터럽트 컨트롤러, 타이머, GPIO, I2C, SPI 등의 구성 정보를 포함.
  2. 커널과 하드웨어 분리:
    • 디바이스 트리를 사용하면 커널을 수정하지 않고도 하드웨어 구성을 변경할 수 있습니다.
  3. 운영 체제 초기화 지원:
    • 커널이 부팅 시 하드웨어 구성을 동적으로 읽어 초기화에 사용.

DTB 파일의 특징

1. DTB 형식

  • **DTB(Device Tree Blob)**는 DTS(Device Tree Source) 파일을 바이너리 형식으로 컴파일한 파일입니다.
  • dtc(Device Tree Compiler)를 사용하여 DTS를 DTB로 변환합니다.

2. DTB 구조

DTB 파일은 트리 형태로 구성되며, 각 노드가 하드웨어 구성 요소를 나타냅니다.

  • 노드(Node):
    • 하드웨어 장치를 나타냅니다.
    • 예: CPU, 메모리, 버스.
  • 속성(Property):
    • 노드에 대한 세부 정보를 정의합니다.
    • 예: 주소, 인터럽트 번호, 클럭 속도.

DTB 파일 생성 과정

  1. DTS 파일 작성:
    • 텍스트 형식의 디바이스 트리 소스 파일을 작성.
    • 예:
      / {
          model = "My Embedded Board";
          compatible = "myboard,v1";
          memory {
              device_type = "ram";
              reg = <0x80000000 0x20000000>;
          };
          cpus {
              cpu@0 {
                  compatible = "arm,cortex-a53";
              };
          };
      };
      
  2. DTC 컴파일:
    • dtc 명령어를 사용해 DTS 파일을 DTB로 컴파일.
    • 예:
      dtc -I dts -O dtb -o myboard.dtb myboard.dts
      
  3. DTB 파일 생성:
    • myboard.dtb 파일이 생성되며, 이를 부트로더 또는 커널에서 사용.

DTB 파일의 사용

1. 부트로더에서 사용

  • U-Boot:
    • U-Boot는 부팅 시 DTB 파일을 로드하여 하드웨어 초기화 정보를 커널에 전달.
    • 명령어 예:
      bootm 0x8000 - 0x10000
      
      • 0x10000: DTB 파일의 메모리 주소.

2. 커널에서 사용

  • Linux 커널은 DTB 파일을 읽어 하드웨어를 초기화.
  • 커널 명령줄에서 DTB 파일 지정:
    bootargs ... dtb=myboard.dtb
    

DTB의 주요 이점

  1. 하드웨어-소프트웨어 분리
    • 디바이스 트리와 커널 코드를 분리하여 유지보수가 쉬움.
  2. 다양한 하드웨어 지원
    • 하나의 커널 이미지로 다양한 하드웨어를 지원 가능.
  3. 동적 하드웨어 초기화
    • 런타임에 필요한 하드웨어 정보를 동적으로 제공.
  4. 커뮤니티 표준
    • ARM 및 RISC-V 아키텍처에서 널리 사용되는 표준.

DTB와 관련된 파일 및 도구

  1. DTS(Device Tree Source):
    • 텍스트 기반 디바이스 트리 파일.
  2. DTB(Device Tree Blob):
    • DTS를 컴파일한 바이너리 파일.
  3. DTC(Device Tree Compiler):
    • DTS 파일을 DTB로 컴파일하거나, DTB 파일을 DTS로 디컴파일.
    dtc -I dtb -O dts -o myboard.dts myboard.dtb
    

결론

DTB 파일은 디바이스 트리를 바이너리 형식으로 저장한 파일로, 임베디드 시스템과 Linux 커널에서 하드웨어 초기화 및 지원을 위한 핵심 역할을 합니다.
이를 통해 커널과 하드웨어 구성을 분리하여 유지보수와 확장성을 크게 향상시킬 수 있습니다. 

Ubuntu 22.04.5 기준

링크 -> https://askubuntu.com/questions/1317036/how-to-rename-a-network-interface-in-20-04

'Linux' 카테고리의 다른 글

my vimrc  (0) 2025.01.14
DTB 파일 이란?  (0) 2025.01.14
is not in the sudoers file. root 권한이 없어 실행 안될 때  (0) 2024.12.15
VB 7.x.x 에서 Ubuntu 22.04.5 터미널 안 열림  (2) 2024.12.15
터미널 비프음 소리 음소거  (0) 2024.12.15

+ Recent posts