osg*_*sgx 11 linux glibc pthreads
我有一个问题:如果我们有一个不使用线程的应用程序,我们可以通过两种方式链接它:
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
Run Code Online (Sandbox Code Playgroud)
默认情况下,两个库都是动态链接的:
$ 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
Run Code Online (Sandbox Code Playgroud)
版本a
和版本之间会有多大差异a1
?什么将以不同的方式在应用程序本身和int glibc中工作?pthreads的链接是否会从线程不安全到线程安全算法内部发生变化?
例如
$ strace ./a 2>&1 |wc -l
73
$ strace ./a1 2>&1 |wc -l
103
Run Code Online (Sandbox Code Playgroud)
在a1跟踪中,加载了两个额外的lib,mprotect
还调用了一些s,并添加了以下部分:
set_tid_address; set_robust_list; rt_sigaction x 2; rt_sigprocmask; getrlimit; uname
Run Code Online (Sandbox Code Playgroud)
Zan*_*ynx 14
glibc本身包含许多pthread函数的存根代码.这些glibc pthread函数什么都不做.但是,当程序与libpthread链接时,那些存根将被替换为真正的pthread锁定函数.
这适用于需要线程安全但不使用线程的库.这些库可以使用pthread锁,但是在加载链接到libpthread的程序或库之前,这些锁实际上不会发生.