当前位置: 首页 > 面试题库 >

为什么glibc和pthread库都定义了相同的API?

祁辰阳
2023-03-14
问题内容

为什么glibc和pthread库都定义了相同的API?这是快照

ubuntu@ubuntu:/lib$ objdump -T /lib/i386-linux-gnu/libc.so.6 |grep pthread_cond_signal
000f8360 g    DF .text  00000039  GLIBC_2.3.2 pthread_cond_signal
0012b940 g    DF .text  00000039 (GLIBC_2.0)  pthread_cond_signal

ubuntu@ubuntu:/lib$ objdump -T /lib/i386-linux-gnu/libpthread.so.0 |grep pthread_cond_signal
0000b350 g    DF .text  0000007c (GLIBC_2.0)  pthread_cond_signal
0000af90 g    DF .text  000000fc  GLIBC_2.3.2 pthread_cond_signal

问题答案:

libpthread.so也是glibc的一部分,它们都包含某些符号的 (相同) 定义。

如果您要查找,pthread_create则会发现它仅存在于libpthread.so-这意味着程序必须链接libpthread.so到实际创建的线程
,但是可以在仅链接到的单线程程序中使用互斥体和条件变量 libc.so。这对于共享内存中存在的进程间互斥锁和进程间条件变量很有用,并用于与单独的进程进行同步 。(由于下面的Zan
Lynx的评论,进行了更正)。

链接到这两个对象都没有问题libpthread.solibc.so即使它们都定义了符号也是如此。ELF链接器允许几个共享库包含同一符号的定义,并且链接器将选择它所看到的第一个,并将其用于对该符号的所有引用,这称为符号插入。允许定义多个符号的另一个功能是,如果一个库包含弱符号,这些弱符号将被具有相同名称的非弱符号覆盖。在这种情况下,
两个库中 的定义 是相同的,因此,使用哪个来 libpthread.so覆盖中的定义
都没有关系 libc.so。如果使用LD_DEBUG 并更改链接器的参数顺序 您应该能够看到实际上在哪个库中找到了该符号。

还有两个库定义相同的符号,每个库具有符号的两个定义,用不同的符号版本,GLIBC_2.0以及GLIBC_2.3.2。此符号版本控制允许多个定义共存于同一库中,以便在不破坏与旧实现链接的代码的情况下,将功能的新的改进版本添加到库中。这使同一共享库可用于使用LinuxThreads的应用程序和使用NPTL的应用程序。链接到库时,引用将绑定到的默认符号pthread_cond_signal@GLIBC_2.3.2对应于该函数的NPTL实现(NPTL首先包含在glibc
2.3.2中)。较旧的符号pthread_cond_signal@GLIBC_2.0是较旧的LinuxThreads实现,它是提供NPTL之前的默认设置。与较早(2.3.2之前)版本的glibc链接的应用程序将绑定到pthread_cond_signal@GLIBC_2.0该符号并将使用该符号。



 类似资料:
  • 问题内容: 我认为您可以在类中定义“ ”或“ ”,但是为什么都在django.utils.datastructures.py中定义。 我的代码: datastructures.py: 以及将在什么情况下致电。 谢谢 问题答案: 您可以定义一个或两个的和。 必须返回一个对象- 可以是一个新对象(通常将任务委派给该对象),一个现有对象(以实现单例,从池中“回收”实例,依此类推),甚至可以 不是 一个实

  • 问题内容: 我继承了一些旧版Java(1.4)代码,并且此设计决策会定期出现。我不知道是否有任何目的或理由。 据我了解接口(并且我的实验得到了加强),使父级和子级实现相同的接口是没有目的的。在这种情况下,from 中的所有内容都在中实现,而in中的方法在中实现。然而,这并不创造需要有落实。 关于接口,有什么我不知道的东西会给这种模式带来一些目的或好处?除了缺乏清晰性之外,还有其他潜在成本会促使其重

  • 我正在使用以下Robocopy命令: 问题是它一直在复制*EXTRA file下列出的某些文件,但该文件已在目标中。 我只希望robocopy复制一个更新版本的文件(创建日期不同) 仅当测试文件。zip的创建日期较新。 为了解决这个问题,我尝试使用/xo表示排除旧文件。没有运气。每当我每分钟执行一次脚本时,都会发生这种情况。

  • 我有财产课: 还有一种方法: 在类的构造函数我有: 为什么当我从object按键调用函数时。我收到一条未定义的消息,为什么变量在内部不可用:

  • 案例1:在下面的代码中,若子对象仅继承(不重写)getPrivateString,则使用子对象的引用调用getPrivateString返回父变量的值。Output=“Variable:父类中的私有访问说明符”。 案例2:在下面的代码中,若子对象覆盖getPrivateString(定义与父对象相同),则使用子对象的引用调用getPrivateString将返回子变量的值。Output=“变量:子

  • 问题内容: 我遇到了“ 高级Linux编程”中的 一个概念。这里是一个链接:请参阅 4.5 GNU / Linux线程实现 。 我对作者所说的概念很清楚,但是我对他解释的为线程打印processID的程序感到困惑。 这是代码 根据作者,上述代码的输出为 我编译时得到的输出是 我知道,创建线程时,Linux内部调用 clone (大多数情况下),就像 fork 系统调用创建进程一样。唯一的区别是在进