M1 맥에서 x86 터미널 명령 실행하기 (symbol(s) not found for architecture arm64 에러)

bokyungkim·2021년 8월 20일
3

42서울에서 주어진 라이브러리를 이용해 프로젝트를 진행하려는데, 내 로컬 M1 맥에서

symbol(s) not found for architecture arm64

에러가 나면서 컴파일이 되지 않는 일이 발생했다.

구글링해보니 42의 라이브러리는 넷와이드 어셈블러(nasm, 인텔 x86 아키텍처용 어셈블러이자 역어셈블러)로 작성되어서 내 M1 맥으로는 인텔 노트북처럼 컴파일이 되지 않았던 것이었다.

해결법은 실행하고자 하는 명령어 앞에 arch -x86_64 명령어를 붙여주는 것. 예를 들면 아래와 같이 해주면 된다.

arch -x86_64 gcc -L../mlx -lmlx -framework OpenGL -framework Appkit main.c

이 예시는 42의 minilibx라는 라이브러리를 사용하면서 컴파일하는 명령어다. 그대로 Makefile의 all에 넣어서 편리하게 사용 중이다.

본래 arch 명령어는 시스템의 CPU에 대한 정보를 확인하는 명령어다. 메뉴얼을 번역해보면 아래와 같다.

  • arch 명령어에 아무 인자를 주지 않으면 시스템의 아키텍처 유형만을 표시한다.
  • 유니버셜 바이너리(Universal Binary, 애플 용어로, 파워피씨나 X86 (인텔) 기반의 매킨토시 컴퓨터에서 에뮬레이션 과정 없이 그대로 실행되는 실행 파일이나 응용 프로그램)의 선택된 아키텍처를 실행하는 기능도 있다.
  • 유니버셜 바이너리에는 다른 아키텍처에서 실행할 수 있는 코드가 포함되어 있다.
  • 기본적으로 운영체제는 프로세서 유형과 가장 일치하는 아키텍처를 선택한다.
  • 64비트 프로세서는 32비트 아키텍처보다 64비트 아키텍처를 선호하지만 32비트 프로세서는 32비트 아키텍처만 실행할 수 있다.
  • 등등...
arch [-32] [-64] [[-arch_name | -arch arch_name]...] [-c] [-d envname]... [-e envname=value]... [-h] prog [args ...]

위와 같은 프로토타입을 갖는데, prog 인자가 바로 내가 원래 실행하고자 하는 명령어다. 또, 아까 예시에선 arch_name이 곧 x86_64인 것.


코로나 때문에 집에서 내 맥북으로 코딩을 하려니 이런 오류도 접하고 덕분에 아키텍처에 대한 공부도 할 수 있었다.

나의 코딩 선생님 구글 땡큐!


📚 참고
http://seyong.me/macos/run-x86-terminal-app-with-apple-silicon/#fn:2

0개의 댓글