Изменяет ли привязка `-lpthread` поведение приложения? (Линукс, Глибк)

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

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

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

E.g.

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

E.g.

$ 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

person osgx    schedule 07.06.2011    source источник


Ответы (1)


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

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

person Zan Lynx    schedule 07.06.2011