bzImage 크로스 컴파일 Linux 커널이 실패함

bzImage 크로스 컴파일 Linux 커널이 실패함

Raspberry Pi 4를 부팅하기 위해 arm64(aarch64) 플랫폼용 Linux 커널을 처음부터 컴파일하고 싶습니다.

호스트는 amd64이고 Debian 변형(Ubuntu 20.04.1 LTS)을 실행합니다.

모든 작업을 수행하기 위해 다음 스크립트를 만들었습니다.

###### 빌드 환경######

# 호스트 시스템이 컴파일하는 데 필요한 소프트웨어 패키지를 다운로드하고 설치합니다.
적절한 설치 빌드 필수 libgmp-dev libmpfr-dev libmpc-dev libisl-dev libncurses5-dev bc git-core bison flex

# RAM에 임시 빌드 환경을 생성합니다.
접두사=/tmp/BE
mkdir -p ${접두사}
${PREFIX} 2>&1 > /dev/null 마운트 해제
마운트 -t tmpfs tmpfs ${PREFIX}

# 바이너리 유틸리티:
# ftp.gnu.org에서 binutils를 다운로드하고 컴파일하여 호스트에 설치합니다. [수정됨]
CD obj-binutils
../binutils-${BINUTILSVERSION}/configure --prefix=${PREFIX}/binutils --target=aarch64-linux-gnu --disable-nls
설치하기 위해서

#걸프협력협의회:
# ftp.gnu.org에서 gcc를 다운로드하고 호스트에 컴파일하고 설치합니다. [편집됨]
# GCC 구성:
../gcc-${GCCVERSION}/configure --prefix=${PREFIX}/gcc --target=aarch64-linux-gnu \
--with-newlib --without-headers --disable-nls --disable-shared --disable-threads \
--disable-libssp --disable-decimal-float --disable-libquadmath --disable-libvtv \
--disable-libgomp --disable-libatomic --활성화-언어=c
# GCC를 설치합니다:
all-gcc -j${thread} 만들기
-gcc를 설치하려면
# 시험:
${PREFIX}/gcc/bin/aarch64-linux-gnu-gcc -v
# libgcc 선택사항 [생략]


###### 리눅스 ######

# 우리는 raspberrypi linux git에서 다운로드했다는 점에 유의하세요.
리눅스브랜치="rpi-5.10.y"
mkdir -p ${PREFIX}/linux
CD ${PREFIX}/linux
git clone --깊이=1 -b ${LINUXBRANCH} https://github.com/raspberrypi/linux.git
mkdir 커널 출력

# 컴파일된 gcc/binutils 바이너리 파일을 linux /bin 디렉토리에 복사합니다.
CD리눅스
목차 목차
mv ${PREFIX}/binutils/bin/* ${PREFIX}/linux/linux/bin/
mv ${PREFIX}/gcc/bin/* ${PREFIX}/linux/linux/bin/

#RPi4 특정 구성
커널=커널8
O=../kernel-out/ ARCH=arm64 CROSS_COMPILE=${PREFIX}/linux/linux/bin/aarch64-linux-gnu-bcm2711_defconfig를 만듭니다.

# 리눅스 메뉴 구성
O=../kernel-out/ ARCH=arm64 CROSS_COMPILE=${PREFIX}/linux/linux/bin/aarch64-linux-gnu-menuconfig로 만듭니다.

# 리눅스 빌드
make -j${THREADS} O=../kernel-out/ ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-
# 결과는 다음과 같습니다.
ls -l /tmp/BE/linux/kernel-out/vmlinux
#나의 경우:
#-rwxr-xr-x 1 루트 루트 26179040 2월 25일 22:48 /tmp/BE/linux/kernel-out/vmlinux


# 리눅스는 vmlinux를 bzImage로 압축합니다.
# 참고: pwd = /tmp/BE/linux/linux
bzImage O=../kernel-out/ ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-로 만듭니다.
${PREFIX} -iname vmlinuz 찾기

하지만 현재 vmlinux에서 bzImage를 생성하는 마지막 단계에서 멈춰 있습니다. 분명히 vmlinux를 vmlinuz로 압축할 수는 없으며 이를 사용해야 합니다 make bzImage. 그러나 이렇게 하면 오류가 발생합니다.

# 알림: pwd = /tmp/BE/linux/linux
make[1]: '/tmp/BE/linux/kernel-out' 디렉토리를 입력하세요.
make[1]: *** 'bzImage' 대상을 생성하는 규칙이 없습니다. 멈추다.
make[1]: '/tmp/BE/linux/kernel-out' 디렉토리를 종료합니다.
make: *** [Makefile:185: __sub-make] 오류 2

bzImage 문제에 대한 도움을 환영합니다. 그러나 일반적으로 제 질문은 ARM64 플랫폼용 Linux 커널을 크로스 컴파일하는 전체 프로세스에 관한 것입니다.

내가 여기서 GCC와 binutils로 하고 있는 일이 올바른지 여부에 대한 조언을 환영합니다. 여기저기서 몇 가지 GCC 오류가 발생합니다. 그러나 vmlinux는 컴파일을 합니다. 먼저 생성된 vmlinux를 테스트하고 이를 vmlinuz로 변환한 후 Ubuntu에서 기존 SD 카드 이미지를 수정하고 싶습니다.

이 스크립트가 RPi4 또는 기타 장치용 ARM64 Linux 커널을 컴파일하려는 다른 사람들에게 유용하도록 내 질문을 편집하고 싶습니다.

답변1

분명히 Linux 커널을 컴파일하는 올바른 절차는 플랫폼마다 다릅니다.

# 32비트 x86에서
bzImage 만들기

# 64비트 x86에서
zImage 만들기

# 64비트 ARM의 경우
이미지 만들기

# 현재 디렉토리에서 컴파일된 리눅스 커널을 검색합니다.
./-iname "*이미지" 찾기

관련 정보