2012-01-02 59 views
0

我正在使用函數,如/usr/include/nptl/pthread.h中的pthread_setaffinity_np。鏈接到TLS libpthread-2.3.4.so庫而不是系統libpthread庫

然而,連接器卻抱怨說沒有找到「pthread_setaffinity_np」,據我所知,連接器正在尋找錯誤的pthread庫中的引用(/usr/lib/libpthread.so)包括對CPU親和力的支持。我在RedHat 4.

我相信我必須鏈接到/lib/tls/libpthread-2.3.4.so其中包括此功能。但是,鏈接到libpthread-2.3.4.so導致其他鏈接器錯誤。

在RedHat 4上鍊接到libpthread-2.3.4.so的正確方法是什麼?

由於提前,

保羅

+1

根據glibc的git歷史記錄,sched_setaffinity_np自2.3.3開始已經在樹中。 – 2012-01-02 13:21:15

回答

0

它可能會無法正常工作。 NPTL現在在GNU libc中。它與內核的版本密切相關(並且你可能正在使用一些古老內核的古老版本)。

好的解決方案是將系統升級到提供足夠新的NPTL(以及最近足夠的內核)以滿足您的需求。處理器關聯性在pthread庫(通常與libc一起打包)內部以及內核內部處理(因爲它與調度程序有關)。

爲什麼不安裝例如CentOS 6(這是a derivative of RedHat)?

+0

不幸的是,由於其他原因,升級不是一種選擇(我很喜歡)。 – Paul 2012-01-02 10:45:07

+0

然後我猜你被卡住了;你需要一些相當新的內核(我不知道哪個);您可以嘗試在chroot中安裝更新的發行版。 – 2012-01-02 10:47:18

2

,據我瞭解,鏈接器尋找錯誤的並行線程庫參考

你的理解是不正確

/usr/lib/libpthread.so鏈接腳本,哪個環節有libpthread.so.0libpthread_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