4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

M1 MacとIntel Macのバイナリの見分け方とユニバーサルバイナリの作成

Posted at

Apple M1 CPU と Intel CPU では
CPUアーキテクチャ(命令文やデータ形式)も異なり
バイナリファイル(実行可能なファイル)の中身も別物になる

※M1搭載のMacで従来(Intel CPU搭載Mac)向けのバイナリが実行できるのは
Rosetta 2というアプリケーションでM1向けバイナリに変換したものを実行しているため

また、macOSの実行ファイル形式Mach-Oでは複数のアーキテクチャのバイナリを格納することが可能で
複数のアーキテクチャ向けバイナリを格納したバイナリをユニバーサルバイナリと呼んだりする

バイナリファイルのアーキテクチャを調べる

file ファイル名 コマンドで調べることができる

# Intel CPU向けバイナリの場合
$ file file ./foo/bar/hoge
./foo/bar/hoge: Mach-O 64-bit executable x86_64

# M1 CPU向けバイナリの場合
$ file ./foo/bar/hoge
./foo/bar/hoge: Mach-O 64-bit executable arm64

# ユニバーサルバイナリの場合
file ./foo/bar/hoge
./foo/bar/hoge: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit executable x86_64] [arm64]
./foo/bar/hoge (for architecture x86_64):	Mach-O 64-bit executable x86_64
./foo/bar/hoge (for architecture arm64):	Mach-O 64-bit executable arm64

クロスビルド

clang(C言語)でのバイナリビルド

--targetオプションで指定する

# M1 CPU向けバイナリビルド
clang -target=arm64-apple-macos12 -o arm64.out main.c

# Intel CPU向けバイナリビルド
clang -target=x86_64-apple-macos12 -o amd64.out main.c

Go言語でのバイナリビルド

環境変数GOARCHでアーキテクチャを指定する

# M1 CPU向けバイナリビルド
GOARCH=arm64 go build -o arm64.out main.go

# Intel CPU向けバイナリビルド
GOARCH=amd64 go build -o amd64.out main.go

ユニバーサルバイナリにする

lipoコマンドで複数のアーキテクチャのバイナリファイルをまとめて1つのバイナリファイルにする

lipo -create -output universal.out arm64.out amd64.out

参考

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?