Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linker glibc.so中的pthread是否由弱符号实现以提供pthread存根函数?_Linker_Pthreads - Fatal编程技术网

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中有一些技巧,比如转发。