피드로 돌아가기
가장 작은 C++ 바이너리
GeekNewsGeekNews
Infrastructure

가장 작은 C++ 바이너리

GCC 최적화 플래그와 정렬 제어로 바이너리 크기 15.8KB에서 400B로 97.5% 절감

neo2026년 6월 7일7advanced

Context

표준 GCC 컴파일 환경에서 생성되는 기본 바이너리의 과도한 오버헤드 분석. 기본 main 함수만 포함된 프로그램임에도 ELF 메타데이터, 동적 링크 구조, 런타임 라이브러리로 인해 15KB 이상의 불필요한 용량 발생.

Technical Solution

  • SYS_exit 시스템콜 직접 호출 및 _start 진입점 정의를 통한 libc 의존성 및 표준 시작 코드 제거
  • -static-no-pie 설정을 통한 동적 링크 구조 및 Position Independent Executable 메타데이터 배제
  • -fno-ident, -fno-exceptions 플래그 적용으로 컴파일러 식별 정보 및 스택 Unwinding용 .eh_frame 섹션 제거
  • -Wa,-mx86-used-note=no 옵션을 통한 x86 ISA 관련 .note.gnu.property 섹션 삭제
  • -Wl,--nmagic 적용으로 0x1000 단위의 정렬 패딩을 제거하여 ELF 헤더와 .text 섹션을 단일 LOAD 세그먼트로 통합

1. 임베디드/초소형 바이너리 설계 시 `-nostdlib` 및 `-nostartfiles`를 통한 런타임 라이브러리 제거 검토

2. `objdump` 및 `readelf`를 활용하여 불필요한 ELF 섹션(.comment, .eh_frame 등) 존재 여부 확인

3. 메모리 매핑 효율화를 위해 링커의 정렬 패딩 옵션(`--nmagic`) 적용 고려

원문 읽기