一尘不染

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

linux

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

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内部将以什么不同的方式工作?pthread的链接会在内部将某些内容从不安全线程更改为线程安全算法吗?

例如

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

在a1跟踪中,加载了两个附加的库,mprotect调用了更多s,并添加了以下内容:

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

阅读 293

收藏
2020-06-03

共1个答案

一尘不染

glibc本身包含许多pthread函数的存根代码。这些glibc
pthread函数不执行任何操作。但是,当程序与libpthread链接时,这些存根将被真正的pthread锁定功能取代。

这旨在用于需要线程安全但不使用线程本身的库中。这些库可以使用pthread锁,但是只有在加载了链接到libpthread的程序或库之后,这些锁才会真正发生。

2020-06-03