주희아빠의 헝그리 라이딩

ARM 환경에서 둠 실행하기. II편 - Cross Compile 본문

나름 IT 이야기

ARM 환경에서 둠 실행하기. II편 - Cross Compile

도림천 버섯돌이 2023. 11. 11. 18:10

2023.11.15

본격적인 크로스 컴파일에 앞서 다음 글을 먼저 읽고 오면 진행에 많은 도움이 됩니다.

https://multitab.tistory.com/261

 

Cross Compile 기초와 OpenSSH ARM 실전 포팅

2023.11.13 1. Cross Compile 기초 '이기종에서 둠 돌리기' 프로젝트를 진행하면서 크로스 컴파일을 공부하고 있을 무렵 마침 실제로 크로스 컴파일을 해야할 일이 하나 생겼습니다. arm 리눅스 기반 시

multitab.tistory.com

 

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
...중략

 

반응형