【问题标题】:Relevance of libc.so.6 in Linux kernel [closed]Linux内核中libc.so.6的相关性[关闭]
【发布时间】:2013-11-10 01:23:16
【问题描述】:

我的问题是Linux内核是否包含libc.so.6?在谷歌搜索并浏览不同的链接后,我们发现libc.so.6 不是 Linux 内核的一部分,因为内核在内核空间中实现了相同的库供自己使用。 libc.so.6 是一个用户空间库。但是,问题仍然存在,如果将 libc.so.6 从“/lib”中删除,它就会崩溃,因为 Linux 的所有基本应用程序都会崩溃。

所以,剩下的基本问题是:

  1. Linux 可以在没有libc.so.6 的情况下运行吗?如果是,在哪里使用了这种实现方式?
  2. 谁提供libc.so.6?它是否仅由 Linux 发行版提供?
  3. Linux 内部是否支持线程?

【问题讨论】:

标签: c linux linux-kernel glibc


【解决方案1】:

Linux 可以在没有 libc.so.6 的情况下运行吗?如果是的话,这是哪里的情况?

使用选项-nostdlib 编译代码不会使用标准库,

man GCC 告诉,

-nostdlib 链接时不要使用标准的系统启动文件或库。不 启动文件,并且只有您指定的库才会传递给链接器。 编译器可以生成对 memcmp、memset、memcpy 和 memmove 的调用。这些 条目通常由 libc 中的条目解析。这些入口点应该是 指定此选项时,通过某种其他机制提供。

检查 webpage 以获得良好的 glibc 免费实施。

【讨论】:

  • 那么在这种情况下它不需要glibc来运行应用程序,并且在这种情况下启动Linux,它不会崩溃?它会继续进行正常的登录和 shell 提示吗?
  • @pRAShANT:“它会继续正常登录和 shell 提示吗?”可能不是,因为 shell 是一个用户空间程序,并且大多数 shell 实现(像大多数其他用户空间程序一样)使用 libc。当 shell 启动时,它会尝试加载 libc。如果失败,shell 就会崩溃。但是内核不会崩溃。 shell 不是内核的一部分——shell 是一个用户空间程序。
【解决方案2】:
  1. 是的。例如,我可以用汇编语言编写一个不使用 libc 的应用程序。以下是一些示例:https://stackoverflow.com/questions/284797/hello-world-in-less-than-20-bytes
  2. 在 Linux 上,glibc 是 libc 的常见实现:https://www.gnu.org/software/libc/
  3. 是的。 glibc 提供的线程选项是内核接口上的填充层。

【讨论】:

  • 但是重点是,如果没有glibc,Kernel会崩溃,并给出内存dump,并且会报告进程init无法找到指定路径下的库文件
  • 其次,如果没有 glibc,我认为在任何应用程序中使用 Linux 作为操作系统都没有实际用处。然后在那种情况下,一个人可以使用固件
  • @pRAShANT:你不同意我可以在不使用 libc 的情况下创建应用程序吗?
  • @pRAShANT:一般来说,许多现实世界的应用程序不太可能不使用 libc 版本。但那是因为它使开发人员能够更快地工作,而不是因为它是必需的。例如,libc 让我做 printf。但如果需要,我可以自己使用对 puts 的系统调用重写 printf。
  • 你把内核空间和用户空间搞混了。 Linux kernel 在没有 libc 的情况下不会崩溃,它是被编译为在执行时动态加载 libc 的用户空间软件导致崩溃(或者更确切地说,不加载) - 因为它们需要 libc操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-06
  • 1970-01-01
  • 1970-01-01
  • 2016-02-24
  • 1970-01-01
相关资源
最近更新 更多