c - 为什么链接程序需要 stdlib?

标签 c gcc linker clang static-libraries

<分区>

采用以下 C 程序:

int main(){}

它没有使用 C 标准库中的任何东西。
我假设我们可以通过 -nostdlib 禁用链接。

但是,这会导致以下错误:

$ gcc -nostdlib -o main main.c
/usr/bin/ld: warning: cannot find entry symbol _start; defaulting to 0000000000400150

谁能解释一下 _start 符号是什么以及谁负责提供它?
如何使用 -nostdlib


根据文档,我也尝试过:

$ gcc -nostdlib -o main main.c -lgcc

clang 的行为相同。

最佳答案

_start 是程序的入口点,cf. this answer . libc 包含一个小 stub ,它从操作系统放置命令行参数的地方读取命令行参数,然后调用 main。因此,需要链接 libc 才能在普通平台上运行普通的 C 程序。

您可以尝试在没有 libc 的情况下编写程序,但您必须提供自己的 _start。但是你不能做太多,你甚至不能返回,因为你没有返回的地方。您唯一的选择是使用汇编来煞费苦心地重新创建您需要的 libc 部分,例如 _exit 函数。

关于c - 为什么链接程序需要 stdlib?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37823271/

相关文章:

C++:关于加载DLL和调用函数的一件小事

objective-c - 如何编译在 Windows 上使用 NSApplication 的 GNUstep 应用程序?

从 gcc 4.2 迁移到 4.8 时代码生成段错误

c - 未定义对 `pow' 和 `floor' 的引用

我可以用我自己的版本替换静态库中的符号吗?

c++ - 需要帮助将函数从 C++ 移植到 Ocaml

我可以通过两者之间的服务器实现客户端 - 客户端通信吗?

c - 从字符串中读取数字列表

c++ - 我可以将普通文件链接到我的可执行文件吗?

compiler-construction - 如何在 Eclipse 和 Windows 中指向我的编译器和链接器?