Связь с библиотекой TLS libpthread-2.3.4.so вместо системной библиотеки libpthread - PullRequest
0 голосов
/ 02 января 2012

Я использую такие функции, как pthread_setaffinity_np из /usr/include/nptl/pthread.h.

Однако компоновщик жалуется, что "pthread_setaffinity_np" не найден, насколько я понимаю, компоновщик ищет ссылку в неправильной библиотеке pthread (/usr/lib/libpthread.so), которая не включает поддержка соответствия процессору. Я на RedHat 4.

Мне кажется, я должен сослаться на /lib/tls/libpthread-2.3.4.so, который включает эту функцию. Однако ссылка на libpthread-2.3.4.so вызвала другие ошибки компоновщика.

Как правильно связать libpthread-2.3.4.so с RedHat 4?

Заранее спасибо,

Пол

Ответы [ 2 ]

2 голосов
/ 02 января 2012

Насколько я понимаю, компоновщик ищет ссылку в неправильной библиотеке pthread

Ваше понимание неверно .

/usr/lib/libpthread.so - это скрипт компоновщика , который связывает вашу программу с libpthread.so.0 и libpthread_nonshared.a. libpthread.so.0 является (должно быть) символической ссылкой, скорее всего, libpthread-2.3.4.so.

Вероятно, в вашей системе установлено несколько версий libpthread-2.3.4.so: одна в /lib/i686, другая в /lib/tls, возможно, также одна в /lib. Какой из них используется во время выполнения, зависит от вашего оборудования и вашего ядра.

Что печатают следующие команды?

find /lib -name 'libpthread.so.0' | xargs nm -A | grep pthread_setaffinity_np

ldd /usr/bin/date
0 голосов
/ 02 января 2012

Возможно, это не сработает.NPTL теперь находится в GNU libc.И это тесно связано с версией ядра (и вы, вероятно, используете какой-то древний дистрибутив со старым ядром.).

Хорошее решение - обновить вашу систему до чего-то, обеспечивающего достаточно недавний NPTL (идостаточно свежее ядро) под ваши нужды.Сходство с процессором обрабатывается как внутри библиотеки pthread (часто в комплекте с libc), так и внутри ядра (поскольку оно связано с планировщиком).

Почему вы не устанавливаете, например CentOS 6 (что является производным от RedHat )?

...