【发布时间】:2022-01-15 20:46:08
【问题描述】:
我正在关注 poncho 在 yt 上的操作系统开发系列。
6th video 使用 extern 将 C++ 与汇编代码链接,但代码链接为 C 代码,因为它是 extern "C" void _start()。
在ExtendedProgram.asm,_start 被称为:
[extern _start]
Start64bit:
mov edi, 0xb8000
mov rax, 0x1f201f201f201f20
mov ecx, 500
rep stosq
call _start
jmp $
Kernel.cpp 有:
extern "C" void _start() {
return;
}
视频中的一个 cmets 显示,对于 C++ 的不同名称,_Z6_startv 是
已创建。
因此,为了尝试,我将Kernel.cpp 修改为:
extern void _Z6_startv() { return; }
还修改了ExtendedProgram.asm,将_start替换为_Z6_startv,但链接器抱怨,
/usr/local/x86_64elfgcc/bin/x86_64-elf-ld:警告:找不到入口符号_start;默认为 0000000000008000
然后我尝试了, 内核.cpp
extern "C++" void _Z6_startv() { return; } // I didn't even know wut i was doin'
链接器又抱怨了。
我确实尝试了一些其他的组合和方法,都以悲惨的结局结束,最终登陆 Stack Overflow。
那么问题来了:
如何将函数编译为C++函数并将其链接到程序集?
【问题讨论】:
-
extern "C"not 表示编译为C代码。这确实意味着该名称具有外部C链接。 -
不,如果您在 C++ 代码中继续使用
start,_Z6_startv是错误符号名称。您需要在 asm 端使用_Z6_startv,而不是 C++ 端。 -
@Jester 是
start还是_start,函数签名应该是extern void _start()?