Меняет ли связывание `-lpthread` поведение приложения?(Linux, Glibc) - PullRequest
11 голосов
/ 07 июня 2011

У меня вопрос: если у нас есть приложение, которое не использует потоки, мы можем связать его двумя способами:

1) Ссылка как обычно, без -lpthread и -ldl

2) Добавьте к ссылке две библиотеки: libpthread и libdl.

1009 * Е.Г. *

$ 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-ов что-либо из поточно-небезопасного в поточно-безопасный алгоритм?

1019 * Е.Г. *

$ 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

1 Ответ

14 голосов
/ 07 июня 2011

Сам glibc содержит код заглушки для многих функций pthread.Эти функции glibc pthread ничего не делают.Однако, когда программа связана с libpthread, эти заглушки заменяются реальными функциями блокировки pthread.

Это предназначено для использования в библиотеках, которые должны быть поточно-ориентированными, но не используют сами потоки.Эти библиотеки могут использовать блокировки pthread, но эти блокировки на самом деле не произойдут, пока не будет загружена программа или библиотека, которая ссылается на libpthread.

...