Vijos (OS)现在支持C++异常了。
其实不需要对OS或libc做很多修改, 只需要正确编写链接器的参数。具体而言, 链接时的对象应当严格按照这个顺序: crt1.o、crti.o、crtbegin.o、待链接的对象以及依赖的函数库(包括libc、libstdc++、libsupc++、libgcc、libgcc_eh等等)、crtend.o。其中, 静态链接时crtbegin一定要使用crtbeginT.o。crtbeginT.o里面比crtbegin.o多一个frame_dummy函数, 该函数会调用__register_frame_info来注册C++异常处理、unwind相关的数据。不调用该函数就会导致catch不到任何异常。
crt开头的.o文件的用途可以在网上查询。
参考资料:
- https://wiki.osdev.org/Creating_a_C_Library
- https://wiki.osdev.org/Calling_Global_Constructors
- https://wiki.osdev.org/C%2B%2B
- https://wiki.osdev.org/C%2B%2B_Exception_Support
- https://wiki.osdev.org/Libsupcxx#Full_C.2B.2B_Runtime_Support_Using_libgcc_And_libsupc.2B.2B
- https://itanium-cxx-abi.github.io/cxx-abi/abi.html
- https://itanium-cxx-abi.github.io/cxx-abi/abi-eh.html
- http://dbp-consulting.com/tutorials/debugging/linuxProgramStartup.html
发表评论