gpt4 book ai didi

c++ - 在没有运行时库的情况下在 Linux 下编译 C++

转载 作者:可可西里 更新时间:2023-11-01 17:52:32 24 4
gpt4 key购买 nike

我最近开始探索生成代码使用 C++ 运行时库的方式。

大多数情况下我很好奇,但我也想评估开发启动 C++ 内核所需的最低要求所需的工作量。

所以我开始实现自己的运行时库,但是我有一个小问题。

int main(int argc, char **argv)
{
return 0;
}

使用以下命令编译:

$ g++ -ffreestanding -nostdlib -fno-builtin -fno-rtti -fno-exceptions -c main.cpp

我收到这个警告:

/usr/bin/ld: warning: cannot find entry symbol _start; defaulting to 00000000080480b8

然后,当我尝试执行生成的二进制文件时,出现“段错误”。我试图编译“main.cpp”和一个 ASM 文件。

[global _start]
[extern main]

_start:
call main

用“ld”手动链接目标文件,我没有收到警告,但二进制文件仍然引发“段错误”。

我想我遗漏了什么。例如,系统 C 库在“__libc_start_main”中执行的操作可能需要在调用“main”之前和之后完成。

此外,如果有人推荐我应该阅读的有关该主题的网站、文档或书籍,我将不胜感激。

谢谢,

帕特里克

最佳答案

好的,感谢 QuantumMechanic 的链接,我设法找到了问题所在: http://www.muppetlabs.com/~breadbox/software/tiny/teensy.html

我只是忘记了我在 linux 编程方面的基础知识,更重要的是如何处理程序结束。

基本上,我需要生成系统调用中断“exit”来处理程序结束。

[BITS 32]

[global _start]
[extern main]

_start:
call main
mov ebx, eax ; Move the returned value in the register used as argument of exit()
mov eax, 1 ; Indicates the id of the syscall to execute
int 0x80 ; Triggers the syscall interrupt

所以现在我可以使用我自己的 RTL 在 linux 上编译任何 C++ 程序来进行一些测试。

请注意,如果永远不会到达“main”函数的末尾,内核将不需要它。

谢谢!

关于c++ - 在没有运行时库的情况下在 Linux 下编译 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5738233/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com