일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 27 | 28 |
29 | 30 | 31 |
- 딸래미
- 박물관
- cross compile
- ARM
- BSC100S
- iGPSPORT
- 비욘드트러스트
- 페루
- 체험학습
- 대만
- 캠핑
- ubuntu 24.04
- 아마추어무선
- 태블릿 리눅스
- 가족여행
- 도쿄
- FT-8
- 갤럭시 핏3
- 둠
- 휴양림
- 크로스 컴파일
- 여행
- 갤럭시 핏2
- 한강
- 어린이
- 한강 라이딩코스
- Termux
- 스마트폰 리눅스
- 제주도
- 일본
- Today
- Total
주희아빠의 헝그리 라이딩
ARM 환경에서 둠 실행하기. II편 - Cross Compile 본문
2023.11.15
본격적인 크로스 컴파일에 앞서 다음 글을 먼저 읽고 오면 진행에 많은 도움이 됩니다.
https://multitab.tistory.com/261
1. 본격 크로스 컴파일
환경: x86 이고 Ubuntu 22.04 LTS 에서 진행하였습니다. 사실은 Windows 10 에 있는 WSL2 환경입니다.
SDL 을 먼저 컴파일 했습니다.
당연히 64bit 로 될거라 생각하고 sdl 은 64bit 로 진행했는데 이후 prboom 의 config 옵션중 64bit 가 없음을 발견했습니다. config 부분의 패치를 통하면 진행이 가능하다는데 이 부분은 찾지 못해 일단은 32bit 로 먼저 진행해 보기로 했습니다.
-- 개발이 완전 처음이라면 컴파일 환경 구성.
$ sudo apt install build-essential
-- 크로스 컴파일을 위해서는 다음중 적당한 것을 선택해 주십시오. 이번글에서는 1, 3번을 사용합니다.
1. sudo apt install gcc-arm-linux-gnueabi
2. sudo apt install gcc-arm-linux-gnueabihf
3. sudo apt install gcc-aarch64-linux-gnu
4. sudo apt install gcc-arm-none-eabi
-- 주의사항. ./configure 진행시 다음 메세지들을 주의깊게 살펴 봅니다.
-- 알맞은 컴파일러를 찾지 못하면 no 인 상태로 그냥 진행하게 되고 그러면 일반 컴파일러를 사용하게됩니다.
checking build system type... x86_64-pc-linux-gnu
checking host system type... arm-unknown-linux-gnueabi
checking target system type... arm-unknown-linux-gnueabi
checking for arm-linux-gnueabi-strip... arm-linux-gnueabi-strip
checking for arm-linux-gnueabi-gcc... arm-linux-gnueabi-gcc
checking whether we are cross compiling... yes
checking whether arm-linux-gnueabi-gcc accepts -g... yes
-- SDL 1.2 수동 컴파일 설치
-- 관련소스를 다운 받고 압축을 푼후 컴파일해 줍니다.
$ git clone https://github.com/libsdl-org/SDL-1.2
$ cd SDL-1.2/
$ ./configure --prefix=$HOME/sdl/arm --target=arm-linux-gnueabi --host=arm-linux-gnueabi
$ make
$ make install
-- 32bit 결과 확인
$ file ~/sdl/arm/lib/*
/home/multitab/sdl/arm/lib/libSDL-1.2.so.0.11.5: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, BuildID[sha1]=76cb48faf805914952e1a78a7e8606206a870417, with debug_info, not stripped
-- 64bit 용을 먼저 만들었으나 쓰지 못함. 이후 재시도 할 때 사용예정.
$ ./configure --prefix=$HOME/sdl/aarch64 --target=aarch64-linux-gnu --host=aarch64-linux-gnu
$ file ~/sdl/aarch64/lib/*
/home/multitab/sdl/aarch64/lib/libSDL-1.2.so.0.11.5: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, BuildID[sha1]=ddc3d84876ae4eb5b56ac9a5749e5977eebe9b0b, with debug_info, not stripped
다음은 prboom 의 ./configure 시 옵션입니다. 사용 예정인 주요 옵션들입니다.
build 는 현재 머신의 정보를. 나머지 host 와 target 은 대상 시스템을 적어주면 됩니다. 그외 sdl 부분에는 방금 위에서 크로스 컴파일한 경로를 적어주면 됩니다.
$ ./configure --help
System types:
--prefix=PREFIX install architecture-independent files in PREFIX
--build=BUILD configure for building on BUILD [guessed]
--host=HOST cross-compile to build programs to run on HOST [BUILD]
--target=TARGET configure for building compilers for TARGET [HOST]
--disable-gl disable OpenGL rendering code
--with-sdl-prefix=PFX Prefix where SDL is installed (optional)
--with-sdl-exec-prefix=PFX Exec prefix where SDL is installed (optional)
--without-mixer Do not use SDL_mixer even if available
--without-net Do not use SDL_net even if available
-- 다운 받고 압축을 풀어줍니다.
$ wget -O prboom-2.5.0.tar.gz https://sourceforge.net/projects/prboom/files/prboom%20stable/2.5.0/prboom-2.5.0.tar.gz/download
$ tar xvf prboom-2.5.0.tar.gz
$ cd prboom-2.5.0
-- 타겟은 32bit arm 시스템 기준
$ ./configure --prefix=$HOME/doom_prboom_arm --disable-gl --without-net \
--build=x86_64-pc-linux-gnu --host=arm-linux-gnueabi --target=arm-linux-gnueabi \
--with-sdl-prefix=$HOME/sdl/arm \
--with-sdl-exec-prefix=$HOME/sdl/arm
$ make
$ make install
prboom 64bit 컴파일 정보 추가합니다.
--64bit 용으로 재도전 합니다.
$ ./configure --prefix=$HOME/doom_prboom_aarch64 --disable-gl --without-net \
--build=x86_64-pc-linux-gnu --host=aarch64-linux-gnu --target=aarch64-linux-gnu \
--with-sdl-prefix=$HOME/sdl/aarch64 \
--with-sdl-exec-prefix=$HOME/sdl/aarch64
-- 처음에는 다음과 같은 에러가 나며 실패합니다.
checking host system type... Invalid configuration `aarch64-linux-gnu': machine `aarch64' not recognized
configure: error: /bin/bash autotools/config.sub aarch64-linux-gnu failed
--prboom 의 config 파일 중 다음 부분을 수정해 줍니다.
-- arm 문구 뒤에 | aarch64 를 추가해 줍니다..
$ vi ./autotools/config.sub - 1608 라인에
| arc | arm | aarch64| arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
--이제 다시 configure 를 수행하면 올바르게 수행완료됩니다.
얼마간 컴파일 화면이 넘어가다가 다음과 같은 에러가 나옵니다. 1편에서 소개한 블로그에 해당 내용이 잘 나와 있습니다. 당황하지 말고 살짝 소스를 수정해 줍니다.
-- 아마 다음과 같은 에러가 나올텐데 해당 라인은 주석으로 막아주면 됩니다. //
./../config.h:191:15: error: two or more data types in declaration specifiers
191 | #define gid_t int
| ^~~
../../config.h:209:15: error: two or more data types in declaration specifiers
209 | #define uid_t int
$ vi config.h
191 라인과 209 라인 // 으로 주석처리 후 다시 make.
-- 컴파일 완료 이후 설치.
$ make install
-- 오. 문제 없이 컴파일까지 되었군요. 필요한 경우 wad 파일 복사하거나 다운받아 줍니다.
$ wget https://distro.ibiblio.org/slitaz/sources/packages/d/doom1.wad
-- 파일 확인...arm 32bit 이기 때문에 타겟 시스템으로 이동후 확인이 가능합니다.
$ file ~/doom_prboom_arm/games/*
/home/multitab/doom_prboom_arm/games/arm-linux-gnueabi-prboom: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, BuildID[sha1]=afe83d52da6d74b7ce31202b19ac3fa7afea2ace, for GNU/Linux 3.2.0, with debug_info, not stripped
/home/multitab/doom_prboom_arm/games/arm-linux-gnueabi-prboom-game-server: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, BuildID[sha1]=4be7a35dedb1954921e1435383f2749c0db12a42, for GNU/Linux 3.2.0, with debug_info, not stripped
-- 압축후 대상 시스템으로 전송
$ cd ~
$ tar cvfz doom_arm_32.tar.gz doom_prboom_arm
$ scp doom_arm_32.tar.gz pi@rasp:~/
-- 압축을 풀고 디렉토리 이동 후
$ tar xvf doom_arm_32.tar.gz
$ cd doom_prboom_arm/games/
-- 부푼 마음을 가지고 실행시켜 봅니다. 짜잔~
pi@raspberrypi:~/doom_prboom_arm/games$ ./arm-linux-gnueabi-prboom
-bash: ./arm-linux-gnueabi-prboom: No such file or directory
아쉽게도 타겟 시스템이 ubuntu 20.04 64bit 버전이라서 32bit 수행을 못하는 듯 합니다.
서둘러서 라즈베리파이의 메모리 카드를 '라즈비안 11 32bit 버전' 으로 갈아 끼우고 재부팅을 합니다.
-- 32bit OS 에서 다시 수행.
pi@raspberrypi:~/doom_prboom_arm/games $ ./arm-linux-gnueabi-prboom
./arm-linux-gnueabi-prboom: /lib/arm-linux-gnueabihf/libc.so.6: version `GLIBC_2.34' not found (required by ./arm-linux-gnueabi-prboom)
./arm-linux-gnueabi-prboom: /lib/arm-linux-gnueabihf/libc.so.6: version `GLIBC_2.33' not found (required by ./arm-linux-gnueabi-prboom)
아... 이거 무슨일입니까...GLIBC 문제를 여기서 또 만나는군요. 이렇게 포기할 수는 없지요.
오늘 안에 끝장을 보기위해 wsl 에 ubuntu 20.04 를 추가로 설치해 봅니다.
C:\Users\multitab>wsl --install -d ubuntu-20.04
환경: x86 이고 Ubuntu 20.04 LTS 으로 변경. Windows 10 에 있는 WSL2 환경입니다.
빠르게 ubuntu 20.04 의 설치를 마치고 앞에서부터의 내용을 다시 한번 반복해 줍니다. 그리고 대망의 실행 순간...
Could not initialize SDL [Unable to open a console terminal] 메세지가 나와서 놀랐는데 지난번 것과는 약간 다릅니다.
$ ./arm-linux-gnueabi-prboom
prboom v2.5.0 (http://prboom.sourceforge.net/)
I_SetAffinityMask: manual affinity mask is 1
Could not initialize SDL [Unable to open a console terminal]
-- 또 실패구나 하고 잠시 슬퍼하다가...
-- GUI 화면이 있는 콘솔에서 직접 실행시키거나
-- X manager 나 Mobaterm 같은 곳으로 출력 방향을 돌려주고 실행하면
$ export DISPLAY=192.168.1.5:0
그래서 터미널이 아닌 GUI 화면이 있는 콘솔에서 실행시켜 보니 실행이 됩니다.
우와..드디어 arm 라즈베리파이에서 Doom 을 실행하는 모습니다. 화면 캡춰를 위해 Modaterm 에서 돌렸는데 여기서는 엄청 느려서 실제 플레이는 불가 수준이네요.
최종적으로 설치완료된 디렉토리 모습.
보통은 doom.wad 만 가져오면 됐는데 arm 에서는 다른 디렉토리의 prboom.wad 까지 복사를 해주어야 동작을 하네요.
$ ~/doom_prboom_arm/games $ cp ../share/games/doom/prboom.wad .
추가. 64bit 용 버전 디렉토리 모습.
혹시라도 다음 에러가 난다면 해당 패키지를 추가해 주고 진행합니다.
pi@raspberrypi:~/doom_prboom_aarch64/games$ ./aarch64-linux-gnu-prboom
./aarch64-linux-gnu-prboom: error while loading shared libraries: libSDL-1.2.so.0: cannot open shared object file: No such file or directory
pi@raspberrypi:~/doom_prboom_aarch64/games$ ldd *
aarch64-linux-gnu-prboom:
linux-vdso.so.1 (0x0000ffff9abf4000)
libSDL-1.2.so.0 => not found
libpthread.so.0 => /lib/aarch64-linux-gnu/libpthread.so.0 (0x0000ffff9aa1f000)
libm.so.6 => /lib/aarch64-linux-gnu/libm.so.6 (0x0000ffff9a974000)
libc.so.6 => /lib/aarch64-linux-gnu/libc.so.6 (0x0000ffff9a801000)
/lib/ld-linux-aarch64.so.1 (0x0000ffff9abc4000)
$ sudo apt install libsdl1.2debian
정리.
'라즈베리파이' 환경이야 워낙 유명해서 그냥 둠을 받아서 돌리면 되지만 이제는 이 방법을 통해 arm 환경의 다른 머신에도 설치할 수 있는 기술이 생겼습니다. 물론 방법을 안다고 쉽게 되지는 않을 것이라 예상합니다.
glibc 버전 문제가 가장 귀찮은 문제중 하나이며 libsdl1.2 와 같은 패키지 설치가 안되는 경우도 고려는 해야 합니다.
오늘의 교훈. 설치가 될 대상 시스템의 glibc 버전과 32/64 bit 여부를 확인하고 시작해야 합니다!
-- 참고. 최종 목표 타겟의 정보
$ uname -a
Linux **** 4.9.113 #2 SMP PREEMPT Thu Oct 5 05:46:51 UTC 2023 aarch64 GNU/Linux
$ cat /etc/os-release
NAME=****
VERSION="****"
$ getconf LONG_BIT
32
$ getconf GNU_LIBC_VERSION
glibc 2.30
$ lscpu
Architecture: aarch64
Byte Order: Little Endian
CPU(s): 4
Vendor ID: ARM
Model name: Cortex-A55
...중략
'나름 IT 이야기' 카테고리의 다른 글
ARM - Cross Compile 기초와 OpenSSH 실전 포팅 (0) | 2023.11.11 |
---|---|
ARM 환경에서 둠 실행하기. III편 - Buildroot (0) | 2023.11.11 |
ARM 환경에서 둠 실행하기. I 편 - 개요/ x86 시도. (0) | 2023.11.11 |
WSL 1 vs WSL 2 실질적인 차이점 (0) | 2023.11.01 |
갤럭시 워치4 vs 갤럭시 핏2 (0) | 2023.06.30 |