在Linux内核中,libc.so.6的相关性

7
我的问题是Linux内核是否包含libc.so.6?经过搜索和查看不同的链接,我们发现libc.so.6不是Linux内核的一部分,因为内核已经实现了自己使用的相同库在内核空间中。 libc.so.6是一个用户空间库。但是,问题仍然存在,如果从“/lib”中删除libc.so.6,则会崩溃,因为所有Linux的基本应用程序都会崩溃。
所以,基本问题留下了:
  1. Linux能否在没有libc.so.6的情况下运行?如果可以,在哪里使用这样的实现?
  2. 谁提供libc.so.6?它只由Linux发行版提供吗?
  3. Linux是否内部支持线程?

4
这并不是一道纯粹的编程问题,更多的是一个架构问题。 - bizzehdee
@bizzehdee:可能不是这样,因为Stack Overflow不仅仅是用于编程查询。它也可以用于概念性问题,就像这里讨论的glibc在Linux中的相关性一样。 - pRAShANT
StackOverflow是一个编程问题网站...http://stackoverflow.com/help/on-topic。你可能想尝试其他的StackExchange网站,比如http://askubuntu.com/、http://serverfault.com/或http://unix.stackexchange.com/。 - bizzehdee
https://dev59.com/V3jZa4cB1Zd3GeqPfZHp - Ciro Santilli OurBigBook.com
2个回答

7

但是问题在于,没有glibc,内核将会崩溃并生成一个内存转储,它会报告进程init无法在指定路径中找到库文件。 - pRAShANT
@pRAShANT:一般来说,很少有真实世界的应用程序不使用libc的版本。但这是因为它使开发人员能够更快地工作,而不是因为它是必需的。例如,libc让我使用printf。但如果需要,我可以使用系统调用重写printf。 - Bill Lynch
抱歉,如果我的之前的回答让您感到冒犯了,但我的疑问更多是关于libc的相关性。我知道它是一个用户空间库,不使用它不应该对系统造成影响。但是,为什么会崩溃,这让我得出了错误的推论。经过以上讨论,我希望能明白Linux可以在没有libc的情况下存在。 - pRAShANT
其实,更多的是关于如果我们说Linux操作系统,那么libc是否属于Linux本身的问题。 - pRAShANT
1
你把内核空间和用户空间搞混了。Linux 内核 在没有libc的情况下不会崩溃,而是在执行时编译为动态加载libc的用户空间软件崩溃(或者说,无法加载)- 因为它们需要libc来运行。 - tangrs
显示剩余2条评论

3

Linux能否在没有libc.so.6的情况下运行?如果可以,在哪些情况下会出现这种情况?

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

man GCC 告诉我们:

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

查看webpage以获取良好的无glibc实现。


那么在这种情况下,运行应用程序将不需要glibc,在引导Linux时也不会崩溃?它会继续进行正常的登录和shell提示符吗? - pRAShANT
1
@pRAShANT:“它会继续进行正常的登录和shell提示符吗?” 可能不会,因为shell是一个用户空间程序,大多数shell实现(就像大多数其他用户空间程序一样)使用libc。当shell启动时,它尝试加载libc。当失败时,shell崩溃。但内核不会崩溃。Shell不是内核的一部分-Shell是一个用户空间程序。 - jcsahnwaldt Reinstate Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接