【发布时间】:2018-09-24 09:18:05
【问题描述】:
我正在尝试从 NASM 调用外部 C++ 函数。当我在谷歌上搜索时,我没有找到任何相关的解决方案。
C++
void kernel_main()
{
char* vidmem = (char*)0xb8000;
/* And so on... */
}
NASM
;Some calls before
section .text
;nothing special here
global start
extern kernel_main ;our problem
运行编译这两个文件后,我收到此错误:kernel.asm(.text+0xe): undefined reference to kernel_main'
这里有什么问题?谢谢。
【问题讨论】:
-
void kernel_main()应该是extern "C" void kernel_main()以避免 c++ 名称修改。extern kernel_main应该是extern _kernel_main因为 C 代码生成。 -
AFAIK 从根本上讲是不可能的。 IE。 c++ 没有标准化的 ABI,名称(符号)被破坏。您需要专门标记它们以某种标准方式导出,例如c 风格通过
extern "C"。阅读这个:stackoverflow.com/questions/1041866/… BTW。我的意思是不可能在二进制级别上以纯 c++ 方式接口 c++,因为没有,您需要遵循一些其他机制,这是非常可能的。 -
我所知道的没有标准化语言有标准 ABI - 当然 C 没有:stackoverflow.com/questions/4489012/does-c-have-a-standard-abi
-
extern _kernel_main将取决于所使用的工具链。如果使用通用的 elf g++ 编译器,则不会有前导下划线。如果工具链针对本机 32 位 Windows 或 MacOS,那就不同了。我建议为 OSDev 工作使用通用 elf 交叉编译器的原因之一正是出于这个原因 - 避免为特定平台生成本机代码的工具链的细微差别。通用 ELF 可执行文件不需要_前缀作为全局可访问符号。
标签: c++ compilation g++ nasm osdev