问题 链接`-lpthread`会改变应用程序行为吗? (Linux,Glibc)


我有一个问题:如果我们有一个不使用线程的应用程序,我们可以通过两种方式链接它:

1)像往常一样链接,没有 -lpthread 和 -ldl

2)添加两个库:libpthread和libdl。

例如。

$ cat a.c
int main(){printf("Hehe");}
$ gcc a.c -w -o a
$ gcc a.c -w -o a1 -ldl -lpthread

默认情况下,两个库都是动态链接的:

$ ldd a
    linux-gate.so.1
    libc.so.6
    /lib/ld-linux.so.2
$ ldd a1
    linux-gate.so.1
    libdl.so.2
    libpthread.so.0
    libc.so.6
    /lib/ld-linux.so.2

版本之间会有多大差异 a 和版本 a1 ?什么将以不同的方式在应用程序本身和int glibc中工作?将pthreads链接从线程不安全到线程安全算法会改变吗?

例如。

$ strace ./a 2>&1 |wc -l
     73
$ strace ./a1 2>&1 |wc -l
    103

在a1跟踪中,加载了两个额外的库,还有一些 mprotects被调用,并添加了以下部分:

 set_tid_address; set_robust_list; rt_sigaction x 2; rt_sigprocmask; getrlimit; uname

11188
2018-06-07 13:47


起源



答案:


glibc本身包含许多pthread函数的存根代码。这些glibc pthread函数什么都不做。但是,当程序与libpthread链接时,那些存根将被替换为真正的pthread锁定函数。

这适用于需要线程安全但不自行使用线程的库。这些库可以使用pthread锁,但是在加载链接到libpthread的程序或库之前,这些锁实际上不会发生。


14
2018-06-07 13:59



链接pthread时会更改哪些存根? - osgx
@osgx: ohloh.net/p/libpthread-stubs - Zan Lynx


答案:


glibc本身包含许多pthread函数的存根代码。这些glibc pthread函数什么都不做。但是,当程序与libpthread链接时,那些存根将被替换为真正的pthread锁定函数。

这适用于需要线程安全但不自行使用线程的库。这些库可以使用pthread锁,但是在加载链接到libpthread的程序或库之前,这些锁实际上不会发生。


14
2018-06-07 13:59



链接pthread时会更改哪些存根? - osgx
@osgx: ohloh.net/p/libpthread-stubs - Zan Lynx