Linker glibc.so中的pthread是否由弱符号实现以提供pthread存根函数?
Linker glibc.so中的pthread是否由弱符号实现以提供pthread存根函数?,linker,pthreads,Linker,Pthreads,pthread是否在glibc.so中由弱符号实现,以提供pthread存根函数 我知道有pthread.so在glibc中提供与pthread类似的函数。所以有人在glibc中说pthread只提供存根,当显式链接到lpthread时将被替换 所以我的问题是如何支持它?使用弱符号或其他技术 libssl与glibc中的pthread类似吗?请参见此。根据使用的是动态链接还是静态链接,可以使用多种技术来允许在链接程序的多个库中定义相同的符号 符号插入。动态链接时,如果在多个库中定义了符号,则链接
pthread
是否在glibc.so
中由弱符号实现,以提供pthread
存根函数
我知道有pthread.so
在glibc中提供与pthread
类似的函数。所以有人在glibc
中说pthread
只提供存根,当显式链接到lpthread
时将被替换
所以我的问题是如何支持它?使用弱符号或其他技术
libssl
与glibc
中的pthread
类似吗?请参见此。根据使用的是动态链接还是静态链接,可以使用多种技术来允许在链接程序的多个库中定义相同的符号
符号插入。动态链接时,如果在多个库中定义了符号,则链接器将使用它找到的第一个版本(除非符号是内部的、隐藏的或受保护的;有关说明,请参阅)
弱小的物体。静态链接时,如果链接器发现两个同名的符号,其中一个是“弱”引用,则链接器将使用非弱引用
符号版本控制也可能发挥作用
几乎在所有情况下,程序都是动态链接到libc的
您可以看到使用ldd加载LIB的顺序:
$ ldd simple_pthread
linux-vdso.so.1 => (0x00007fffaddff000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fa13a474000)
libc.so.6 => /lib64/libc.so.6 (0x00007fa13a0e0000)
/lib64/ld-linux-x86-64.so.2 (0x00007fa13a6a0000)
在这里可以看到,在链接顺序中,libpthread位于libc之前。几乎总是这样;libc总是使用默认编译器选项最后链接
因此,与libpthread链接的程序将使用这些符号的pthread版本,因为它们是在链接顺序中首先遇到的
如果仍不确定,则在启动程序时将环境变量LD_DEBUG设置为“bindings”将显示正在发生的实际符号绑定
如果您使用的是静态链接,那么您将针对libc.a而不是libc.so进行链接。您可以使用“nm”列出符号的详细信息。弱符号的类型为“W”或“W”
(感谢@Kaz指出弱符号不会影响动态链接)。是的,glibc使用了各种pthread函数的存根实现,这样单线程程序就不必浪费周期来锁定和解锁互斥对象,也不必链接到不同的C库(例如,就像微软世界所做的那样)
例如,根据POSIX,每次调用fputc(ch,stream)
,有互斥锁和解锁。如果您不想这样做,可以调用fputc\u unlocked
。但是当您这样做时,您使用的是与线程相关的POSIX扩展;对于不使用POSIX或不使用线程API的程序来说,这不是一个合适的解决方法
存根pthread函数与真实函数的重写(在动态glibc中)不是基于弱符号的。共享库机制使重写非弱定义成为可能
弱符号是一种允许在静态链接下覆盖符号的机制。
如果您需要上述语句的源代码,请参见:
“请注意,DSO中的弱定义没有任何影响。弱定义仅在静态链接中起作用。”[Ulrich Drepper,]
如果在系统上的静态glibc上运行nm
,libc.a
,您会注意到像pthread\u mutex\u lock
这样的函数被标记为弱函数。在动态版本中,libc.so.
,函数没有被标记为弱函数
注意:您应该使用nm-D
或nm--dynamic
查看共享库中的符号。nm
不会在已剥离的共享库上生成任何内容。如果是,则您查看的是调试符号,而不是动态符号。问题很不清楚:什么样的“支持”您需要提供pthread和glibc吗?除非您正在编写一个系统工具(如调试器),否则您不应该关心pthread符号是作为弱符号还是其他什么实现的。您试图解决什么具体问题?我想知道glic如何为pthread提供存根功能?您正在查看调试符号。一个撕开。所以文件不会给你任何符号,除非你使用nm--dynamic
或nm-D
。我想它应该避免链接订单问题,所以即使首先查找libc.so,它也应该在运行时调用正确的函数。glibc中有一些技巧,比如转发。