gpt4 book ai didi

c++ - 没有标准库的准系统 C++?

转载 作者:IT老高 更新时间:2023-10-28 22:34:59 34 4
gpt4 key购买 nike

GCC 和 Clang 等编译器允许在没有 C++ 标准库的情况下编译 C++ 程序,例如使用 -nostdlib 命令行标志。似乎这样经常无法链接你,例如:

void f() noexcept { throw 42; }
int main() { f(); }

通常由于 undefined symbol (如 __cxa_allocate_exceptiontypeinfo for int__cxa_throw__gxx_personality_v0__clang_call_terminate__cxa_begin_catchstd::terminate()

即使是简单的

int main() {}

链接失败

ld: warning: cannot find entry symbol _start; defaulting to 0000000000400120

并在执行时被操作系统杀死。使用 -c 编译器仍然运行链接器,它明显失败:

ld: error in mytest(.eh_frame); no .eh_frame_hdr table will be created.

在不使用和链接到标准库的情况下编程和编译 C++ 应用程序或库是否是一个现实的目标?如何在 Linux 上使用 GCC 或 Clang 编译我的代码?如果没有标准库,将无法使用哪些核心语言功能?

最佳答案

您基本上可以在 osdev.org 找到所有问题的解答。 ,但无论如何我都会给出一个简短的总结。

当你给 GCC -nostdlib ,您是在说“没有启动文件或库文件”。这包括:

  • crti.ocrtbegin.ocrtend.ocrtn.o。一般内核开发者只关心实现crti.ocrtend.o,让GCC提供crtbegin.ocrtend.o 通过将 -print-file-name= 传递给链接器。通常这些只是分别由 .init.fini 组成的 stub ,为 GCC 留出空间来推送 crtbegin.ocrtend.o 分别。这些文件是调用全局构造函数/析构函数所必需的。
  • 你无法避免链接 libgcc ("low-level runtime library" (-lgcc) 因为即使你传递了 -nostdlib GCC 也会在你使用它时发出对其函数的调用,导致看似没有的莫名其妙的链接错误原因。即使您正在实现/移植 C library 也是如此。
  • 您“不需要”libstdc++ 不,但通常内核开发人员需要它。 Porting a C library那么从头开始实现 C++ 标准库是一项极其艰巨的任务。

由于您只想摆脱“标准库”,但保留 libc(在 Linux 系统上),您实际上是在使用 C 库编写 C++。当然,这并没有错,你自己做,但最终我不明白这一点,除非你打算开发内核。

必读:

OSDev's C++ page - 如果你真的关心 RTTI/异常支持,它是 more annoying to implement than it sounds .通常人们只是通过 -fno-rtti-fno-exceptions 然后担心它或根本不担心。

关于c++ - 没有标准库的准系统 C++?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37250187/

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