Cosmopolitan을 이용한 포터블 mruby 바이너리

발행: (2026년 1월 7일 오후 08:59 GMT+9)
4 min read
원문: Dev.to

Source: Dev.to

배경

mruby의 주요 매력 중 하나는 독립 실행형 실행 파일을 만들 수 있다는 점입니다. 이것은 잘 작동하지만, 고전적인 제한 사항은 대부분의 독립 실행형 바이너리가 빌드된 시스템과 동일하거나 매우 유사한 시스템에서만 실행된다는 것입니다. 예를 들어, amd64 Linux에서 빌드된 실행 파일은 Silicon Mac에서 실행되지 않습니다:

$ ./hello
exec: Failed to execute process: './hello' the file could not be run by the operating system.
exec: Maybe the interpreter directive (#! line) is broken?

mruby는 일부 교차 컴파일 기능을 제공하지만, 이는 위협적으로 느껴질 수 있고 작동시키기가 종종 어렵습니다(예: Linux → macOS). 그래서 다음과 같은 질문이 떠오릅니다: macOS Docker 이미지 없이 진정으로 포터블한 mruby 바이너리를 만들 수 있을까?

Cosmopolitan Libc

mruby 변경 로그를 살펴보던 중 눈에 띈 항목이 있습니다:

New Platform: Cosmopolitan Libc

Cosmopolitan Libc는 C를 “어디서든 빌드하고, 어디서든 실행”할 수 있는 언어로 만들고자 하며, 인터프리터나 가상 머신이 필요 없는 Java와 비슷합니다. GCC/Clang을 재구성하여 POSIX‑인증 폴리글롯 포맷을 출력하도록 하며, 이 포맷은 다음 환경에서 네이티브로 실행됩니다:

  • Linux
  • macOS
  • Windows
  • FreeBSD, OpenBSD, NetBSD
  • BIOS (AMD64 & ARM64)

성능은 네이티브에 가깝습니다.

Cosmopolitan으로 mruby 빌드하기

사전 준비

  1. Cosmopolitan 툴킷을 다운로드합니다:

    wget https://cosmo.zip/pub/cosmocc/cosmocc.zip
    unzip cosmocc.zip -d ~/Downloads/cosmocc
  2. 툴킷이 ~/Downloads/cosmocc에 압축 해제되었는지 확인하거나, 경로를 적절히 조정합니다.

Step 1 – mruby 빌드

COSMO_ROOT=~/Downloads/cosmocc rake MRUBY_CONFIG=cosmopolitan

Note: 작성 시점에 mirb 타깃은 Cosmopolitan과 함께 컴파일이 실패하므로 설정에서 제거해야 했습니다.

Step 2 – 바이트코드 생성

Cosmopolitan 전용 mrbc 바이너리를 사용합니다:

./mruby/bin/mrbc.com -Bhello_world hello.rb

이 명령은 컴파일된 Ruby 바이트코드를 담은 hello_world라는 C 배열을 생성합니다.

Step 3 – 최종 실행 파일 컴파일

~/Downloads/cosmocc/bin/cosmocc -std=c99 -Imruby/include main.c \
    -o hello mruby/build/host/lib/libmruby.a -lm
  • main.c는 생성된 바이트코드를 로드하는 작은 C 엔트리 파일입니다.
  • 결과물인 hello 바이너리는 Cosmopolitan 실행 파일입니다.

결과

생성된 hello 바이너리는 Linux와 macOS(Apple Silicon 포함) 모두에서 수정 없이 실행됩니다. 포터블성을 위해 전통적인 mruby 실행 파일보다 크기가 큰 것이 단점이지만, 여러 플랫폼을 대상으로 배포할 때는 간편해집니다.

Back to Blog

관련 글

더 보기 »

cppsp란 무엇인가?

cppsp – C++ 기반의 트랜스파일된 스크립트형 언어 요구 사항 - C++ 컴파일러가 설치되어 있고 해당 폴더가 시스템 PATH 환경 변수에 추가되어 있음. - ...