【发布时间】:2023-03-25 13:20:01
【问题描述】:
GCC 和 Clang 等编译器允许在没有 C++ 标准库的情况下编译 C++ 程序,例如使用-nostdlib 命令行标志。似乎这样经常无法链接你,例如:
void f() noexcept { throw 42; }
int main() { f(); }
由于__cxa_allocate_exception、typeinfo for int、__cxa_throw、__gxx_personality_v0、__clang_call_terminate、__cxa_begin_catch、std::terminate() 等未定义符号,通常无法链接。
即使是简单的
int main() {}
链接失败
ld:警告:找不到条目符号
_start;默认为 0000000000400120
并在执行时被操作系统杀死。使用-c 编译器仍会运行链接器,该链接器明显失败:
ld:
mytest(.eh_frame) 中的错误;不会创建.eh_frame_hdr表。
在不使用和链接到标准库的情况下编程和编译 C++ 应用程序或库是否是一个现实的目标?如何在 Linux 上使用 GCC 或 Clang 编译我的代码?如果没有标准库,将无法使用哪些核心语言功能?
【问题讨论】:
-
我想你需要:libcrt(c runtime where
_startis)你可能需要libsupc++,这是异常库支持。 -
你的编译器应该记录细节。您可能只需要链接一堆启动代码(例如
crtn.o等)。对于例外情况,一些 C++ ABI 运行时库应该提供必要的功能(libcxxabi?)。 -
什么是“
-c链接”?-c告诉 GCC不 链接。 -
我将此问题标记为“过于宽泛”,因为答案取决于编译器(我们假设 GCC)、ABI(我们假设 x86/x86_64 System V ABI 在具有 glibc 的系统上)以及究竟是什么您正在尝试实施(我介绍了一个小样本)。 osdev.org 是我所知道的关于该主题的最全面的资源。