V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
piqizhu8
V2EX  ›  问与答

glibc 是 Linux 的标准库,是不是在 Linux 上编译出的程序,底层都会和 glibc 有关联?

  •  
  •   piqizhu8 · 2021-03-06 16:25:15 +08:00 · 2102 次点击
    这是一个创建于 1350 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我的理解是:

    glibc 提供了标准接口(便于程序员调用),
    我们开发的软件,通过调用 glibc 的接口, 间接实现了 控制操作系统

    那是不是说明, 如果移除了 glibc,Linux 上的软件就无法运行了?

    而借助 glibc,我们就可以实现自己的编程语言?

    而由于 glibc 是 c 语言实现的, 那我们实现的编程语言(假设 z 语言),z 语言开发的程序,z 编译器必然要把 z 代码翻译成 c 语言代码 ,再由 c 编译器 编译成可执行程序?

    请问我的理解对吗?

    哪里错了,我该补充什么知识呢

    谢谢

    6 条回复    2021-03-06 22:04:24 +08:00
    billlee
        1
    billlee  
       2021-03-06 16:54:05 +08:00   ❤️ 2
    libc 里面的接口可以分为两类,POSIX 标准定义的系统调用( man 手册的第 2 章),以及 C 标准定义的库函数( man 手册的第 3 章)。

    控制操作系统必须通过系统调用,所以 libc 理论上是必须的。但是,有些语言,如 golang 绕过了 libc 直接实现了对内核的系统调用,这样的好处是不依赖 libc, 但问题是 POSIX 只定义了系统调用的 C 接口,这样实现相当于依赖内核的不稳定接口。

    z 语言的编译器不需要把 z 代码翻译成 C 代码。只需要在系统调用时按 C 语言的调用约定去调用 libc 就可以了。

    libc 有很多不同的实现,glibc 只是其中一种。
    pkookp8
        2
    pkookp8  
       2021-03-06 17:20:17 +08:00   ❤️ 1
    内核也是一个软件,也是一个大库。驱动就可以动态加载,调用一些内核接口。
    没有 glibc,把驱动当一般软件写,也不是不行
    minami
        3
    minami  
       2021-03-06 18:18:01 +08:00   ❤️ 1
    可以不依赖 glibc,比如静态链接编译一个 busybox,就可以不依赖 glibc 运行许多常规命令了。除了静态链接,还可以选择 glibc 以外的 C 运行库,比如用 musl 编译 busybox 。在 linux 平台上,只要和系统调用打交道,应该最终都必须依赖 C 标准库,可以不是 glibc,如 alpine linux 就使用 musl 。
    至于你说的“如果移除了 glibc,Linux 上的软件就无法运行了?”,请移步《如何拯救一台 glibc 被干掉的 Linux 服务器?》一文。答案是,在常见的发行版上,确实就几乎等于凉了,如果把运行的 ssh 也关掉的话,就再也 ssh 不上去了,凉透了,doge
    msg7086
        4
    msg7086  
       2021-03-06 18:40:06 +08:00   ❤️ 2
    和系统打交道,根本上是系统调用。( Windows 上则是 Windows API 。)
    只不过 libc 把系统调用给你封装好了,然后你只要用 C 语言调用一下函数就行了。
    当然你也可以自己从头实现一遍 libc 自己用。

    glibc 用 C 语言实现,和其他语言怎么调用 glibc 完全没关系。有种东西叫 API,只要你按照 API 调用规范来写程序,什么语言都能互相调用。比如 Java 可以走 JNI 调用 C 库,根本不需要把 Java 程序编译成 C 。
    liuminghao233
        5
    liuminghao233  
       2021-03-06 21:30:51 +08:00 via iPhone
    你可以把参数放寄存器然后自己 syscall
    Claar
        6
    Claar  
       2021-03-06 22:04:24 +08:00 via iPhone
    本质应该是系统调用
    libc 是基于系统调用的通用功能实现
    就像 tls 库,你固然可以自己实现,但是外面有人专门去维护你为什么要专门自己实现一次
    如果你把调用其他人写的库理解为运行他人的函数就很容易理解了,无论你写的程序是用什么语言,当你调用 libc 库的时候你都是把 cpu 控制权临时转移给了库函数,他本质是一堆操作(指令)的集合体,用什么语言写的根本不重要
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2859 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 11:35 · PVG 19:35 · LAX 03:35 · JFK 06:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.