为什么stdlib需要链接程序?

时间:2016-06-14 22:39:12

标签: 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相同的行为。

1 个答案:

答案 0 :(得分:1)

_start是该计划的切入点,参见this answer。 libc包含一个小存根,它读取操作系统放置它们的位置之外的命令行参数,然后调用main。因此,需要链接libc以便在普通平台上运行正常的C程序。

您可以尝试编写没有libc的程序,但是您必须提供自己的_start。你做不了多少,你甚至无法回归,因为你什么也没回来。您唯一的选择是使用程序集精心重新创建所需的libc部分,例如_exit函数。