fatal error: gelf.h: No such file or directory 오류

Linux 커널을 소스에서 빌드하다 보면 tools/objtool을 컴파일하는 단계에서 gelf.h 헤더를 찾지 못해 빌드가 중단되는 경우가 있다. objtool은 커널 빌드 시 오브젝트 파일의 제어 흐름을 분석해 ORC unwinder 테이블 생성, retpoline/livepatch 검증 등에 쓰이는 도구인데, 내부적으로 ELF 파일을 다루기 위해 libelf 라이브러리를 사용한다. 이 글에서는 이 에러의 원인과 해결 방법을 정리한다.

에러 상황

Raspberry Pi용 커널(rasp_linux) 소스 트리에서 make로 빌드를 진행하면 다음과 같이 objtool 빌드 단계에서 에러가 발생한다.

/home/jammy/work/rasp_linux/tools/objtool/include/objtool/elf.h:10:10: fatal error: gelf.h: No such file or directory
   10 | #include <gelf.h>
      |          ^~~~~~~~
compilation terminated.

원인

objtool/include/objtool/elf.h는 ELF 파일을 파싱하기 위해 libelfgelf.h(32비트/64비트 ELF를 동일한 API로 다루기 위한 “generic ELF” 헤더)를 include한다. 이 헤더는 libelf-dev 패키지에 포함돼 있는데, 커널 빌드에 필요한 다른 툴체인 패키지와 달리 기본 빌드 환경에는 설치돼 있지 않은 경우가 많아 이 에러가 발생한다.

해결 방법

libelf-dev 패키지를 설치하면 /usr/include/gelf.h가 함께 설치되어 문제가 해결된다.

sudo apt-get update
sudo apt-get install libelf-dev -y

설치 후 다시 빌드하면 objtool이 정상적으로 컴파일된다.

make -j$(nproc)

참고: 커널 빌드 시 함께 필요한 패키지

libelf-dev 외에도 커널 빌드 환경에 따라 아래 패키지들이 없어서 비슷한 방식으로 빌드가 중단되는 경우가 흔하다. 한 번에 설치해 두면 이후 다른 헤더 누락 에러를 미리 방지할 수 있다.

sudo apt-get install libssl-dev flex bison bc libncurses-dev -y

libssl-dev는 모듈 서명·인증서 관련 커널 옵션(CONFIG_MODULE_SIG 등)에, flex/bison은 커널 설정 파서 생성에, libncurses-devmake menuconfig TUI에 필요하다.

참고 사이트

답글 남기기