【问题标题】:Why is stdlib required to link programs? [duplicate]为什么需要 stdlib 来链接程序? [复制]
【发布时间】:2016-06-14 22:39:12
【问题描述】:

下面的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 也有同样的行为。

【问题讨论】:

  • 首先要注意的是,这是一个 linker 错误——这并不意味着它无法编译。
  • @Dmitri 是的,我会修改标题。
  • -lgcc 必须放在最后。 Gcc 在遇到库时处理它们,因此它们仅用于从前面提到的对象中解析符号。
  • 你认为是为什么?链接可能需要它,但编译不需要它!即使是后者也不需要。
  • this answer 会回答您的问题吗?如果是这样,我会将您的问题作为重复项关闭。如果不是,则可能有助于突出您问题中的不同之处。

标签: c gcc linker clang static-libraries


【解决方案1】:

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

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

【讨论】:

  • "因此,需要链接 libc 才能运行任何 C 程序。" - 对不起,这是完全错误的!如果需要,这取决于环境。在大多数嵌入式系统上它不是,甚至没有一个标准库可以链接。
  • @Olaf 没有 C 标准库的嵌入式系统不符合标准。无论如何,我稍微改写了答案。你能接受吗?
  • 老实说,我认为我的嵌入式代码是非常好的“普通 C 程序”。事实上,不要在标准中找到该术语。
  • 很好!请仔细阅读标准(翻译和执行环境)。
  • 独立环境不需要提供标准库本身,而只需要特定的headers,它不声明任何对象/(具有外部链接的函数。简而言之:有没有什么可以链接到一个独立的实现,因为这些头文件只提供类型和宏。
猜你喜欢
  • 2012-03-16
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-03
  • 2012-02-16
  • 1970-01-01
相关资源
最近更新 更多