У меня есть вопрос: если у нас есть приложение, которое не использует потоки, мы можем связать его двумя способами:
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 загружаются две дополнительные библиотеки, еще несколько mprotect
вызывается и добавляется раздел:
set_tid_address; set_robust_list; rt_sigaction x 2; rt_sigprocmask; getrlimit; uname