Влияет ли ссылка на "-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 загружаются две дополнительные библиотеки, еще несколько mprotect вызывается и добавляется раздел:

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

Ответ 1

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

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