ngwork0301 / mikanos

Educational Operating System
Apache License 2.0
0 stars 0 forks source link

`undefined symbol: __cxa_pure_virtual`でリンクエラーになる #1

Open ngwork0301 opened 3 years ago

ngwork0301 commented 3 years ago

現象

4.3節 osbook_day04cでリンクエラーになる。

+ make
clang++     -I/root/osbook/devenv/x86_64-elf/include/c++/v1 -I/root/osbook/devenv/x86_64-elf/include -I/root/osbook/devenv/x86_64-elf/include/freetype2     -I/root/edk2/MdePkg/Include -I/root/edk2/MdePkg/Include/X64     -nostdlibinc -D__ELF__ -D_LDBL_EQ_DBL -D_GNU_SOURCE -D_POSIX_TIMERS     -DEFIAPI='__attribute__((ms_abi))' -O2 -Wall -g --target=x86_64-elf -ffreestanding -mno-red-zone -fno-exceptions -fno-rtti -std=c++17 -c main.cpp
ld.lld -L/root/osbook/devenv/x86_64-elf/lib --entry KernelMain -z norelro --image-base 0x100000 --static -o kernel.elf main.o
ld.lld: error: undefined symbol: __cxa_pure_virtual
>>> referenced by main.cpp
>>>               main.o:(vtable for PixelWriter)
Makefile:15: recipe for target 'kernel.elf' failed
make: *** [kernel.elf] Error 1

原因

「仮想関数ポインタが記入されていないオブジェクトが作成され、__cxa_pure_virtualで定義される純粋仮想関数が呼び出される可能性」が残されているため?
__cxa_pure_virtualという関数の定義は、通常libstdc++などの開発環境にいれたライブラリに入っているらしいので、そっちがリンクされていれば問題にならないはずだが、どこかで開発環境構築まわりでミスったか?

対処

本家のMakefileにあるリンクオプションをみてもそれらしいものはなかった。
stakoverflowでの対処同様に、以下の定義を追加して回避することにする。
今後の開発でlibstdc++を静的リンクするようなことになれば、解決するようになるのかもしれない。

extern "C" void __cxa_pure_virtual() { while (1); }

備考

ngwork0301 commented 3 years ago

本家のコミット修正 Commit: 2a4348790a0d313bb52b674f258122f1d4f2511e でも同様に__cxa_pure_virtual関数の実装が入れられている。
なぜか自分の環境では早い段階でこの問題が発生した様子。