macOS で x86_64-unknown-uefi 向けにコンパイルする
これを書いている段階では、macOS で x86_64-unknown-uefi target にコンパイルすることができない。
まず、なぜコンパイルが通らないかを調べる。
まず、エラーログ
- プロジェクトの場所は
/Users/takahashiatsuki/Develop/tmp/rust/uefi
- rust toolchain の場所は
/Users/takahashiatsuki/Develop/tmp/rust/rust/build/x86_64-apple-darwin/stage1
note: "clang" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-unknown-uefi/debug/deps/uefi-0e1435c74da24411.1asqj1by1d7akti8.rcgu.o" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-unknown-uefi/debug/deps/uefi-0e1435c74da24411.29cq6pyx6f87zydc.rcgu.o" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-unknown-uefi/debug/deps/uefi-0e1435c74da24411.2zzfb32mlo2uw1l4.rcgu.o" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-unknown-uefi/debug/deps/uefi-0e1435c74da24411.3y88odnddqlknzpz.rcgu.o" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-unknown-uefi/debug/deps/uefi-0e1435c74da24411.40bxlohptpnngrzr.rcgu.o" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-unknown-uefi/debug/deps/uefi-0e1435c74da24411.4es49u13rnb8m9w7.rcgu.o" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-unknown-uefi/debug/deps/uefi-0e1435c74da24411.4w7ulspepevce0oi.rcgu.o" "-L" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-unknown-uefi/debug/deps" "-L" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/debug/deps" "-L" "/Users/takahashiatsuki/Develop/tmp/rust/rust/build/x86_64-apple-darwin/stage1/lib/rustlib/x86_64-unknown-uefi/lib" "-Wl,-Bstatic" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-unknown-uefi/debug/deps/libuefi-5269a2210aa77b2f.rlib" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-unknown-uefi/debug/deps/libbitflags-9917c86c0513d194.rlib" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-unknown-uefi/debug/deps/libucs2-f59e60e1d7a9e1c2.rlib" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-unknown-uefi/debug/deps/libbit_field-fa540754d89dc44d.rlib" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-unknown-uefi/debug/deps/liblog-383fb2d0c561f604.rlib" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-unknown-uefi/debug/deps/libcfg_if-2e454a2ba1cfa1b8.rlib" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-unknown-uefi/debug/deps/librustc_std_workspace_core-743a7742ab69cc0f.rlib" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-unknown-uefi/debug/deps/libcore-af04cb2c902c205f.rlib" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-unknown-uefi/debug/deps/libcompiler_builtins-d66dced84a1a4787.rlib" "-Wl,-Bdynamic" "-Wl,--eh-frame-hdr" "-Wl,--nxcompat" "-L" "/Users/takahashiatsuki/Develop/tmp/rust/rust/build/x86_64-apple-darwin/stage1/lib/rustlib/x86_64-unknown-uefi/lib" "-o" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-unknown-uefi/debug/deps/uefi-0e1435c74da24411.efi" "-nodefaultlibs"
= note: ld: warning: directory not found for option '-L/Users/takahashiatsuki/Develop/tmp/rust/rust/build/x86_64-apple-darwin/stage1/lib/rustlib/x86_64-unknown-uefi/lib'
ld: warning: directory not found for option '-L/Users/takahashiatsuki/Develop/tmp/rust/rust/build/x86_64-apple-darwin/stage1/lib/rustlib/x86_64-unknown-uefi/lib'
ld: unknown option: -Bstatic
clang-12: error: linker command failed with exit code 1 (use -v to see invocation)
改行バージョン
note: "clang" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-unknown-uefi/debug/deps/uefi-0e1435c74da24411.1asqj1by1d7akti8.rcgu.o" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-unknown-uefi/debug/deps/uefi-0e1435c74da24411.29cq6pyx6f87zydc.rcgu.o" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-unknown-uefi/debug/deps/uefi-0e1435c74da24411.2zzfb32mlo2uw1l4.rcgu.o" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-unknown-uefi/debug/deps/uefi-0e1435c74da24411.3y88odnddqlknzpz.rcgu.o" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-unknown-uefi/debug/deps/uefi-0e1435c74da24411.40bxlohptpnngrzr.rcgu.o" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-unknown-uefi/debug/deps/uefi-0e1435c74da24411.4es49u13rnb8m9w7.rcgu.o" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-unknown-uefi/debug/deps/uefi-0e1435c74da24411.4w7ulspepevce0oi.rcgu.o" "-L" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-unknown-uefi/debug/deps" "-L" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/debug/deps" "-L" "/Users/takahashiatsuki/Develop/tmp/rust/rust/build/x86_64-apple-darwin/stage1/lib/rustlib/x86_64-unknown-uefi/lib" "-Wl,-Bstatic" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-unknown-uefi/debug/deps/libuefi-5269a2210aa77b2f.rlib" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-unknown-uefi/debug/deps/libbitflags-9917c86c0513d194.rlib" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-unknown-uefi/debug/deps/libucs2-f59e60e1d7a9e1c2.rlib" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-unknown-uefi/debug/deps/libbit_field-fa540754d89dc44d.rlib" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-unknown-uefi/debug/deps/liblog-383fb2d0c561f604.rlib" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-unknown-uefi/debug/deps/libcfg_if-2e454a2ba1cfa1b8.rlib" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-unknown-uefi/debug/deps/librustc_std_workspace_core-743a7742ab69cc0f.rlib" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-unknown-uefi/debug/deps/libcore-af04cb2c902c205f.rlib" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-unknown-uefi/debug/deps/libcompiler_builtins-d66dced84a1a4787.rlib" "-Wl,-Bdynamic" "-Wl,--eh-frame-hdr" "-Wl,--nxcompat" "-L" "/Users/takahashiatsuki/Develop/tmp/rust/rust/build/x86_64-apple-darwin/stage1/lib/rustlib/x86_64-unknown-uefi/lib" "-o" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-unknown-uefi/debug/deps/uefi-0e1435c74da24411.efi" "-nodefaultlibs"
= note: ld: warning: directory not found for option '-L/Users/takahashiatsuki/Develop/tmp/rust/rust/build/x86_64-apple-darwin/stage1/lib/rustlib/x86_64-unknown-uefi/lib'
ld: warning: directory not found for option '-L/Users/takahashiatsuki/Develop/tmp/rust/rust/build/x86_64-apple-darwin/stage1/lib/rustlib/x86_64-unknown-uefi/lib'
ld: unknown option: -Bstatic
clang-12: error: linker command failed with exit code 1 (use -v to see invocation)
リンクがうまくいっていないことがわかる。原因は↓の2つ
-
<toolchain dir>/lib/rustlib/x86_64-unknown-uefi/lib
が存在しない- このディレクトリは、対象 target 用の様々な library ( libunwind など ) を含んでいるようなディレクトリだが、今回は no_std 環境なので必要ないはず
- 実際、linux 環境でもこのディレクトリは存在しない
- でも linux 環境で発行されてるコマンドを見ると、同様のディレクトリを含むよう指示されてるので、単に directory not found でもエラーにしないだけかも
-
-Bstatic
オプションが macOS 版の clang に存在しない- macOS では static link を公式にはサポートしていないため、デフォルトで入っている clang には
-Bstatic
オプションが存在しないっぽい
- macOS では static link を公式にはサポートしていないため、デフォルトで入っている clang には
macOSで他の環境向けにビルドする時に、どのようなリンクコマンドが発行されているのか( -Bstatic
が含まれているのか )調べる。
clang
<dependent object files...>
-L <project root>/target/<target triple>/debug/deps
-L <project root>/target/debug/deps
-L <toolchain root>/lib/rustlib/<target triple>/lib
-
-Wl,-Bstatic
: リンカに-Bstatic
オプションを渡す <dependent rlibs...>
-Wl,-Bdynamic
-Wl,--eh-frame-hdr
-Wl,--nxcompat
-L <toolchain root>/lib/rustlib/<target triple>/lib
-o <output name>
-nodefaultlibs
linux環境でのリンクコマンド
- プロジェクト root は
/home/uefi-sample
- rust toolchain の場所は
/usr/local/rustup/toolchains/nightly-x86_64-unknown-linux-gnu
"rust-lld" "-flavor" "link" "/NOLOGO" "/entry:efi_main" "/subsystem:efi_application" "/home/uefi-sample/target/x86_64-unknown-uefi/debug/deps/uefi_sample-8c021b79e37515c7.16wtcmle5y196l56.rcgu.o" "/home/uefi-sample/target/x86_64-unknown-uefi/debug/deps/uefi_sample-8c021b79e37515c7.1xbtpbuoowwsjag9.rcgu.o" "/home/uefi-sample/target/x86_64-unknown-uefi/debug/deps/uefi_sample-8c021b79e37515c7.49kche77p5isbkx5.rcgu.o" "/home/uefi-sample/target/x86_64-unknown-uefi/debug/deps/uefi_sample-8c021b79e37515c7.50kpwe4af20vrpx1.rcgu.o" "/home/uefi-sample/target/x86_64-unknown-uefi/debug/deps/uefi_sample-8c021b79e37515c7.5e7f678xw0naq9j6.rcgu.o" "/home/uefi-sample/target/x86_64-unknown-uefi/debug/deps/uefi_sample-8c021b79e37515c7.7v0497p4rrlaoj2.rcgu.o" "/home/uefi-sample/target/x86_64-unknown-uefi/debug/deps/uefi_sample-8c021b79e37515c7.p0i29afk38pja3d.rcgu.o" "/LIBPATH:/home/uefi-sample/target/x86_64-unknown-uefi/debug/deps" "/LIBPATH:/home/uefi-sample/target/debug/deps" "/LIBPATH:/usr/local/rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-uefi/lib" "/home/uefi-sample/target/x86_64-unknown-uefi/debug/deps/libuefi-5d47539f04dcb73a.rlib" "/home/uefi-sample/target/x86_64-unknown-uefi/debug/deps/libbitflags-98b9f77ed43c6193.rlib" "/home/uefi-sample/target/x86_64-unknown-uefi/debug/deps/libucs2-4a2b00cc822c58a7.rlib" "/home/uefi-sample/target/x86_64-unknown-uefi/debug/deps/libbit_field-6e23816b0b11c0be.rlib" "/home/uefi-sample/target/x86_64-unknown-uefi/debug/deps/liblog-e094a6587778e480.rlib" "/home/uefi-sample/target/x86_64-unknown-uefi/debug/deps/libcfg_if-13f5533a8aa88602.rlib" "/home/uefi-sample/target/x86_64-unknown-uefi/debug/deps/librustc_std_workspace_core-a479fdacdeccde3f.rlib" "/home/uefi-sample/target/x86_64-unknown-uefi/debug/deps/libcore-3e774a2a1c1016b3.rlib" "/home/uefi-sample/target/x86_64-unknown-uefi/debug/deps/libcompiler_builtins-97f922fff8aa3a79.rlib" "/NXCOMPAT" "/LIBPATH:/usr/local/rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-uefi/lib" "/OUT:/home/uefi-sample/target/x86_64-unknown-uefi/debug/deps/uefi_sample-8c021b79e37515c7.efi" "/OPT:REF,NOICF" "/DEBUG" "/NODEFAULTLIB"
改行バージョン
"rust-lld" "-flavor" "link" "/NOLOGO" "/entry:efi_main" "/subsystem:efi_application" "/home/uefi-sample/target/x86_64-unknown-uefi/debug/deps/uefi_sample-8c021b79e37515c7.16wtcmle5y196l56.rcgu.o" "/home/uefi-sample/target/x86_64-unknown-uefi/debug/deps/uefi_sample-8c021b79e37515c7.1xbtpbuoowwsjag9.rcgu.o" "/home/uefi-sample/target/x86_64-unknown-uefi/debug/deps/uefi_sample-8c021b79e37515c7.49kche77p5isbkx5.rcgu.o" "/home/uefi-sample/target/x86_64-unknown-uefi/debug/deps/uefi_sample-8c021b79e37515c7.50kpwe4af20vrpx1.rcgu.o" "/home/uefi-sample/target/x86_64-unknown-uefi/debug/deps/uefi_sample-8c021b79e37515c7.5e7f678xw0naq9j6.rcgu.o" "/home/uefi-sample/target/x86_64-unknown-uefi/debug/deps/uefi_sample-8c021b79e37515c7.7v0497p4rrlaoj2.rcgu.o" "/home/uefi-sample/target/x86_64-unknown-uefi/debug/deps/uefi_sample-8c021b79e37515c7.p0i29afk38pja3d.rcgu.o" "/LIBPATH:/home/uefi-sample/target/x86_64-unknown-uefi/debug/deps" "/LIBPATH:/home/uefi-sample/target/debug/deps" "/LIBPATH:/usr/local/rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-uefi/lib" "/home/uefi-sample/target/x86_64-unknown-uefi/debug/deps/libuefi-5d47539f04dcb73a.rlib" "/home/uefi-sample/target/x86_64-unknown-uefi/debug/deps/libbitflags-98b9f77ed43c6193.rlib" "/home/uefi-sample/target/x86_64-unknown-uefi/debug/deps/libucs2-4a2b00cc822c58a7.rlib" "/home/uefi-sample/target/x86_64-unknown-uefi/debug/deps/libbit_field-6e23816b0b11c0be.rlib" "/home/uefi-sample/target/x86_64-unknown-uefi/debug/deps/liblog-e094a6587778e480.rlib" "/home/uefi-sample/target/x86_64-unknown-uefi/debug/deps/libcfg_if-13f5533a8aa88602.rlib" "/home/uefi-sample/target/x86_64-unknown-uefi/debug/deps/librustc_std_workspace_core-a479fdacdeccde3f.rlib" "/home/uefi-sample/target/x86_64-unknown-uefi/debug/deps/libcore-3e774a2a1c1016b3.rlib" "/home/uefi-sample/target/x86_64-unknown-uefi/debug/deps/libcompiler_builtins-97f922fff8aa3a79.rlib" "/NXCOMPAT" "/LIBPATH:/usr/local/rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-uefi/lib" "/OUT:/home/uefi-sample/target/x86_64-unknown-uefi/debug/deps/uefi_sample-8c021b79e37515c7.efi" "/OPT:REF,NOICF" "/DEBUG" "/NODEFAULTLIB"
macOSで x86_64-apple-darwin
向けにコンパイルしたときのリンクコマンド
"clang" "-m64" "-arch" "x86_64" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-apple-darwin/debug/deps/uefi-e05a757167d8e58f.199ae6hvfuzewenf.rcgu.o" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-apple-darwin/debug/deps/uefi-e05a757167d8e58f.19sex9lqxphpho78.rcgu.o" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-apple-darwin/debug/deps/uefi-e05a757167d8e58f.1w7ob3ybs18vtd33.rcgu.o" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-apple-darwin/debug/deps/uefi-e05a757167d8e58f.4cd7betgq2g2cmsv.rcgu.o" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-apple-darwin/debug/deps/uefi-e05a757167d8e58f.5bvl25szjc0429j1.rcgu.o" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-apple-darwin/debug/deps/uefi-e05a757167d8e58f.7n6yb4wxmppt7oc.rcgu.o" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-apple-darwin/debug/deps/uefi-e05a757167d8e58f.zea5xrgfmufa36w.rcgu.o" "-L" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-apple-darwin/debug/deps" "-L" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/debug/deps" "-L" "/Users/takahashiatsuki/.rustup/toolchains/nightly-x86_64-apple-darwin/lib/rustlib/x86_64-apple-darwin/lib" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-apple-darwin/debug/deps/libuefi-f45b8f1f7b442909.rlib" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-apple-darwin/debug/deps/libbitflags-6ed65ca93c8947e3.rlib" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-apple-darwin/debug/deps/libucs2-e6f1de2bc6d38ac4.rlib" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-apple-darwin/debug/deps/libbit_field-4abfbe6fb06a2bcd.rlib" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-apple-darwin/debug/deps/liblog-bf398fc05e5715a9.rlib" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-apple-darwin/debug/deps/libcfg_if-9de01852b18e07cd.rlib" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-apple-darwin/debug/deps/librustc_std_workspace_core-bf2032c7c36dd022.rlib" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-apple-darwin/debug/deps/libcore-2c2dd2120768cb4c.rlib" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-apple-darwin/debug/deps/libcompiler_builtins-00956d8d6670426a.rlib" "-L" "/Users/takahashiatsuki/.rustup/toolchains/nightly-x86_64-apple-darwin/lib/rustlib/x86_64-apple-darwin/lib" "-o" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-apple-darwin/debug/deps/uefi-e05a757167d8e58f" "-Wl,-dead_strip" "-nodefaultlibs"
改行バージョン
"clang" "-m64" "-arch" "x86_64" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-apple-darwin/debug/deps/uefi-e05a757167d8e58f.199ae6hvfuzewenf.rcgu.o" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-apple-darwin/debug/deps/uefi-e05a757167d8e58f.19sex9lqxphpho78.rcgu.o" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-apple-darwin/debug/deps/uefi-e05a757167d8e58f.1w7ob3ybs18vtd33.rcgu.o" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-apple-darwin/debug/deps/uefi-e05a757167d8e58f.4cd7betgq2g2cmsv.rcgu.o" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-apple-darwin/debug/deps/uefi-e05a757167d8e58f.5bvl25szjc0429j1.rcgu.o" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-apple-darwin/debug/deps/uefi-e05a757167d8e58f.7n6yb4wxmppt7oc.rcgu.o" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-apple-darwin/debug/deps/uefi-e05a757167d8e58f.zea5xrgfmufa36w.rcgu.o" "-L" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-apple-darwin/debug/deps" "-L" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/debug/deps" "-L" "/Users/takahashiatsuki/.rustup/toolchains/nightly-x86_64-apple-darwin/lib/rustlib/x86_64-apple-darwin/lib" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-apple-darwin/debug/deps/libuefi-f45b8f1f7b442909.rlib" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-apple-darwin/debug/deps/libbitflags-6ed65ca93c8947e3.rlib" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-apple-darwin/debug/deps/libucs2-e6f1de2bc6d38ac4.rlib" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-apple-darwin/debug/deps/libbit_field-4abfbe6fb06a2bcd.rlib" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-apple-darwin/debug/deps/liblog-bf398fc05e5715a9.rlib" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-apple-darwin/debug/deps/libcfg_if-9de01852b18e07cd.rlib" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-apple-darwin/debug/deps/librustc_std_workspace_core-bf2032c7c36dd022.rlib" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-apple-darwin/debug/deps/libcore-2c2dd2120768cb4c.rlib" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-apple-darwin/debug/deps/libcompiler_builtins-00956d8d6670426a.rlib" "-L" "/Users/takahashiatsuki/.rustup/toolchains/nightly-x86_64-apple-darwin/lib/rustlib/x86_64-apple-darwin/lib" "-o" "/Users/takahashiatsuki/Develop/tmp/rust/uefi/target/x86_64-apple-darwin/debug/deps/uefi-e05a757167d8e58f" "-Wl,-dead_strip" "-nodefaultlibs"
clang
-m64
-arch x86_64
-
<dependent object files...>
: リンクするオブジェクトファイルを追加 -
-L <project root>/target/<target triple>/debug/deps
: ライブラリ検索パスを追加 -L <project root>/target/debug/deps
-L <toolchain root>/lib/rustlib/<target triple>/lib
<dependent rlib files...>
-o <output name>
-
-Wl,-dead_strip
: リンカに-dead_strip
オプションを渡す -nodefaultlibs
色々試した後で、↓のコメントを見つけた。
クロスコンパイル時には、特定の linker を使ったりするように cargo に指示しなければいけないらしい。システムの linker だとサポートしていない機能とかが必要のため(たぶん)
その方法に関しては、↓のポストを読めとのこと
きたーーー!!!
リンカに lld
を指定したらちゃんとビルドできた!
このときの指定の仕方が若干複雑だった。
まず、rustc が呼び出すリンカを指定する一般的な方法は、rustc に -C linker=lld
のようにオプションを渡すか、 .cargo/config.toml
ファイルの target.<triple>.linker
で指定する。(後者の場合も内部では cargo が rustc にオプションを渡している)
ただし、macOS ではこの方法ではうまくいかない。cargo が発行している rustc のオプションを見てみると、
rustc ... -C linker=lld ... -C linker=clang
のように、 -C linker=clang
で上書きされてしまっている。(この問題に関する調査も後々したい)
そこで、 clang が利用するリンカを lld にするよう変えてみる。
clang も cargoと同じく、実態はコンパイラドライバなので、内部で別のリンカを呼び出している。
clang が利用するリンカを lld にする方法は↓の記事を参考にした。
結論だけいうと、 -fuse-ld=lld
オプションを渡してあげればいい。
そこで、rustc に -C link-arg=-fuse-ld=lld
オプションを渡すようにしてみる。
cargo 経由で渡す場合
cargo rustc -- -C link-arg=-fuse-ld=lld
.cargo/config.toml 経由で渡す場合
[target.x86_64-unknown-uefi]
rustflags = "-C link-arg=-fuse-ld=lld"
この状態でビルドをすると、 .efi
ファイルが生成される。
qemuで試してみたところ、ちゃんと動作もした。yey!