引き続き
Mac で始める「ゼロからのOS自作入門」 - yamoridon - Qiita
の記事を見ながら実行していきます。

3.5 カーネルからピクセルを描く(osbook_day03c)

本の通りにすると、カーネル main.cpp をコンパイラするところで、エラーになってしまいます。
これは、zshシェル(macOS catalina からデフォルトのシェル)の場合、スペースの入った$CPPFLAGS変数がきちんと展開されないためです。
(→サポートページ Issue #60

% cd $HOME/workspace/mikanos

% git checkout osbook_day03c

% cd kernel

% source $HOME/osbook/devenv/buildenv.sh

% echo $CPPFLAGS

-I/Users/user0/osbook/devenv/x86_64-elf/include/c++/v1 -I/Users/user0/osbook/devenv/x86_64-elf/include -I/Users/user0/osbook/devenv/x86_64-elf/include/freetype2 -I/Users/user0/edk2/MdePkg/Include -I/Users/user0/edk2/MdePkg/Include/X64 -nostdlibinc -D__ELF__ -D_LDBL_EQ_DBL -D_GNU_SOURCE -D_POSIX_TIMERS -DEFIAPI='__attribute__((ms_abi))'

% clang++ $CPPFLAGS -O2 --target=x86_64-elf -fno-exceptions -ffreestanding -c main.cpp

main.cpp:1:10: fatal error: 'cstdint' file not found
#include <cstdint>
              ^~~~~~~~~

1 error generated.


そこで、以下のように冒頭に eval を付けるとエラーが回避できるそうです。
% eval clang++ $CPPFLAGS -O2 --target=x86_64-elf -fno-exceptions -ffreestanding -c main.cpp


次の、リンクでも前々回の osbook_day03a の記事と同じく、Macではリンカのオプションに -z separate-code を追加します。
% ld.lld $LDFLAGS --entry=KernelMain -z norelro --image-base 0x100000 --static -o kernel.elf -z separate-code main.o



続いて、ブートローダ $HOME/workspace/mikanos/MikanLoaderPkg/Main.c は、書き換える部分があります。(→@yamoridonさんの記事 参照)

typedef void EntryPointType(UINT64, UINT64);

typedef void __attribute__((sysv_abi)) EntryPointType(UINT64, UINT64);
に変更します。

変更したら、ビルドします。
% cd $HOME/edk2

% source edksetup.sh

% build

それでは、QEMUで実行してみます。(長いですがコマンドプロンプトの% を除いて1行です。)
% $HOME/osbook/devenv/run_qemu.sh $HOME/edk2/Build/MikanLoaderX64/DEBUG_CLANGPDB/X64/Loader.efi $HOME/workspace/mikanos/kernel/kernel.elf


day03c


しま模様になりました!



ゼロからのOS自作入門
内田公太
マイナビ出版
2021-03-22