Linux中的libc和glibc

Linux平台上的C标准库主要由libc和glibc组成。libc提供基本的C语言函数库,如stdio.h、stdlib.h等,而glibc是GNU组织的C库,包含更多针对Linux操作系统的功能。glibc的.so文件通常位于/lib/libc.so.6。要查看glibc版本,可以使用ldd --version或strings /lib/libc.so.6 | grep GLIBC。C库头文件分布在不同目录下,如/usr/include和/usr/lib/gcc/i486-linux-gnu/4.3.2/include。了解这些库对于Linux下的C程序开发至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、libc库

Linux平台提供的C标准库包括:

  • 一组头文件,定义了很多类型和宏,声明了很多库函数。这些头文件放在哪些目录下取决于不同的编译器,stdarg.h和stddef.h位于/usr/lib/gcc/i486-linux-gnu/4.3.2/include目录下,stdio.h、stdlib.h、time.h、math.h、assert.h位于/usr/include目录下。C99标准定义的头文件有24个,本书只介绍其中最基本、最常用的几个。

  • 一组库文件,提供了库函数的实现。大多数库函数在libc共享库中,有些库函数在另外的共享库中,例如数学函数在libm中。在第 4 节 “共享库”讲过,通常libc共享库是/lib/libc.so.6。

  •        ANSI C 函数库是基本的 C 语言函数库,包含了 C 语言最基本的库函数。这个库可以根据头文件划分为 15 个部分,其中包括: 

    1. <ctype.h>:包含用来测试某个特征字符的函数的函数原型,以及用来转换大小写字母的函数原型;
    2. <errno.h>:定义用来报告错误条件的宏;
    3. <float.h>:包含系统的浮点数大小限制;
    4. <math.h>:包含数学库函数的函数原型;
    5. <stddef.h>:包含执行某些计算 C 所用的常见的函数定义;
    6. <stdio.h>:包含标准输入输出库函数的函数原型,以及他们所用的信息;
    7. <stdlib.h>:包含数字转换到文本,以及文本转换到数字的函数原型,还有内存分配、随机数字以及其他实用函数的函数原型;
    8. <string.h>:包含字符串处理函数的函数原型;
    9. <time.h>:包含时间和日期操作的函数原型和类型;
    10. <stdarg.h>:包含函数原型和宏,用于处理未知数值和类型的函数的参数列表;
    11. <signal.h>:包含函数原型和宏,用于处理程序执行期间可能出现的各种条件;
    12. <setjmp.h>:包含可以绕过一般函数调用并返回序列的函数的原型,即非局部跳转;
    13. <locale.h>:包含函数原型和其他信息,使程序可以针对所运行的地区进行修改。
    14. 地区的表示方法可以使计算机系统处理不同的数据表达约定,如全世界的日期、时间、美元数和大数字;
    15. <assert.h>:包含宏和信息,用于进行诊断,帮助程序调试。
    上述库函数在其各种支持 C 语言的 IDE 中都是有的。 你要是使用fopen/memcpy等等这样标准C的函数,当然在链接时使用到标准C库(ANSI C),如果你使用了read/write这些glibc库实现的函数,肯定就在链接时使用到glibc库

           GNU C 函数库是一种类似于第三方插件的东西。由于 Linux 是用 C 语言写的,所以 Linux 的一些操作是用 C 语言实现的,因此,GUN 组织开发了一个 C 语言的库 以便让我们更好的利用 C 语言开发基于 Linux 操作系统的程序。不过现在的不同的 Linux 的发行版本对这两个函数库有不同的处理方法,有的可能已经集成在同一个库里了。 

    glibc下载地址:http://mirror.hust.edu.cn/gnu/

    glibc是linux下面c标准库的实现,即GNU C Library。glibc本身是GNU旗下的C标准库,后来逐渐成为了Linux的标准c库,而Linux下原来的标准c库Linux libc逐渐不再被维护。Linux下面的标准c库不仅有这一个,如uclibc(https://www.uclibc.org/)、klibc,以及上面被提到的Linux libc,但是glibc无疑是用得最多的。glibc在/lib目录下的.so文件为libc.so.6。


    查看当前系统的 glibc 版本的两种方法: 
    1.
    01 [root@Betty ~]# /lib/libc.so.6
    02 GNU C Library stable release version 2.5, by Roland McGrath et al.
    03 Copyright (C) 2006 Free Software Foundation, Inc.
    04 This is free software; see the source for copying conditions.
    05 There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
    06 PARTICULAR PURPOSE.
    07 Compiled by GNU CC version 4.1.2 20080704 (Red Hat 4.1.2-52).
    08 Compiled on a Linux 2.6.9 system on 2013-01-08.
    09 Available extensions:
    10         The C stubs add-on version 2.1.2.
    11         crypt add-on version 2.1 by Michael Glad and others
    12         GNU Libidn by Simon Josefsson
    13         GNU libio by Per Bothner
    14         NIS(YP)/NIS+ NSS modules 0.19 by Thorsten Kukuk
    15         Native POSIX Threads Library by Ulrich Drepper et al
    16         BIND-8.2.3-T5B
    17         RT using linux kernel aio
    18 Thread-local storage support included.
    19 For bug reporting instructions, please see:
    20 <http://www.gnu.org/software/libc/bugs.html>.
    21 [root@Betty ~]#
    2. 
    1 [root@Betty ~]# ldd  --version
    2 ldd (GNU libc) 2.5
    3 Copyright (C) 2006 Free Software Foundation, Inc.
    4 This is free software; see the source for copying conditions.  There is NO
    5 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    6 Written by Roland McGrath and Ulrich Drepper.
    7 [root@Betty ~]#


    【官方说明】

    Glibc 
    Overview: 
    Any Unix-like operating system needs a C library: the library which defines the ``system calls'' and other basic facilities such as open, malloc, printf, exit... 
    The GNU C Library is used as the C library in the GNU systems and most systems with the Linux kernel.
    Project Goals:  
    The GNU C Library is primarily designed to be a portable and high performance C library. It follows all relevant standards including ISO C11 and POSIX.1-2008. It is also internationalized and has one of the most complete internationalization interfaces known.
    History: 
    The history of Unix and various standards determine much of the interface of the C library. In general the GNU C Library supports the ISO C and POSIX standards. We also try to support the features of popular Unix variants (including BSD and System V) when those do not conflict with the standards. Different compatibility modes (selectable when you compile an application) allow the peaceful coexistence of compatibility support for different varieties of Unix. 

  • 具体使用了什么库,要看你调用的函数了~可能不会仅仅只包含一个库~
    
    Linux下,库的路径一般是:/lib,/usr/lib,/usr/local/lib等,这些路径一般会在/etc/ld.so.conf 中标记出来,如果需要添加特殊位置的库,可以把库的路径添加到/etc/ld.so.conf中去,并且执行ldconfig来使得新路径立即生效~ 

<think>好的,我现在需要处理用户关于Linux系统中glibc库函数的查询。首先,用户要求的信息包括glibc的基本概念、核心功能、常用函数示例、调试方法以及版本兼容性问题,同时需要结合提供的引用内容来组织回答。 首先,我应该确认glibc的定义它在Linux系统中的作用。根据引用[1][2],glibc是GNU C库,作为Linux的标准C库,它扩展了ANSI C标准,提供了更多功能。这部分需要放在回答的开头,解释glibc是什么以及它的重要性。 接下来是核心功能模块。引用[1]提到glibc涵盖输入输出、字符串处理、数学运算、文件操作等,需要分点列出这些模块,并给出每个模块的具体函数例子。例如,文件操作中的open函数,引用[4]中提到了open函数的跟踪,可以结合说明glibc如何与系统调用交互。 然后,用户可能需要了解如何使用这些函数。需要提供一个简单的示例代码,比如使用openread函数。这里要确保代码符合C语法,并正确调用glibc的函数,同时添加注释说明。 调试诊断部分,引用[3]提到了LD_DEBUG环境变量,这在动态链接库调试中很有用。需要解释如何设置LD_DEBUG来获取加载信息,比如导出变量后运行程序,这样用户可以看到库加载的详细过程。这部分可以具体说明不同的参数如bindingsfiles的作用。 版本兼容性方面,引用[4]中的例子展示了如何检查glibc版本,用户可能需要知道如何查看系统中的glibc版本,以及不同版本之间的兼容性问题。这里需要给出命令,如使用ldd --version或者检查libc.so.6,并提醒开发者注意版本差异带来的影响。 最后,根据用户提供的引用内容,特别是引用[5]关于Linux系统调用的部分,可以补充glibc与系统调用的关系,说明glibc如何封装系统调用,提供更友好的接口给开发者。 在生成相关问题部分,需要围绕glibc的功能、调试、版本兼容性、与系统调用的关系以及安全性等方面提问,确保问题覆盖用户可能感兴趣的扩展领域。 检查是否需要正确使用LaTeX格式,但问题中似乎没有数学表达式,所以可能不需要。但如果有任何技术术语或代码,确保格式正确。例如,代码块使用三个反引号包裹,环境变量使用等宽字体。 总结回答结构:概述glibc、核心模块、示例代码、调试方法、版本兼容性,最后相关问题。确保每个部分都引用正确的来源,如引用[1]、[2]等,并自然地在段落末尾添加引用标识。 现在需要验证是否有遗漏的信息,比如glibc的扩展功能,如线程支持、国际化等,引用[2]提到相比标准库做了扩展,所以需要补充这些内容到核心功能模块中。另外,引用[4]中的open函数调用跟踪可以进一步说明glibc与内核的交互过程,但可能不需要太深入,保持回答的简洁性。 确保回答使用中文,结构清晰,分点明确,代码示例正确,引用标识正确放置,并且相关问题具有相关性,能够引导用户进一步探索。</think>### Linux glibc库函数详解 #### 1. glibc概述 glibc(GNU C Library)是Linux系统的标准C语言函数库,基于ANSI C标准扩展,提供输入输出、字符串处理、内存管理、数学运算等核心功能。作为用户程序与内核间的桥梁,glibc封装了系统调用(如文件操作`open`、`read`),并提供线程支持、国际化等扩展特性[^1][^2]。 #### 2. 核心功能模块 - **文件操作**:`open`、`read`、`write`等函数实现文件读写。例如,`open`函数通过系统调用进入内核,最终调用`do_sys_open`完成操作[^4]。 - **字符串处理**:`strlen`、`strcpy`、`strcat`等函数提供高效字符串操作。 - **动态内存管理**:`malloc`、`free`等函数管理堆内存。 - **数学运算**:`sqrt`、`sin`、`log`等函数支持复杂计算。 - **进程控制**:`fork`、`exec`等函数用于进程创建与管理。 #### 3. 示例代码:文件读取 ```c #include <fcntl.h> #include <unistd.h> int main() { int fd = open("test.txt", O_RDONLY); // 调用glibc的open函数 char buffer[100]; read(fd, buffer, sizeof(buffer)); // 读取文件内容 close(fd); return 0; } ``` #### 4. 调试与诊断 通过环境变量`LD_DEBUG`可追踪动态链接过程: ```bash export LD_DEBUG=files,bindings ./my_program # 查看库加载与符号绑定信息[^3] ``` 参数说明: - `files`:显示加载的共享库路径。 - `bindings`:输出符号解析过程。 #### 5. 版本兼容性 - **查看版本**: ```bash ldd --version # 显示当前glibc版本 strings /lib/x86_64-linux-gnu/libc.so.6 | grep GLIBC_ # 列出支持的版本 ``` - **兼容性问题**:若程序依赖高版本glibc(如2.18),需确保系统版本不低于此,否则需升级或静态编译。 #### 6. glibc与系统调用 glibc封装了Linux系统调用(如`sys_open`),将其转化为更易用的接口。例如,用户调用`open()`时,glibc通过`int 0x80`或`syscall`指令触发内核态处理[^5]。 --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值