2012-06-22 3 views
10

glibc와 pthread 라이브러리가 모두 동일한 API를 정의한 이유는 무엇입니까? 여기glibc와 pthread 라이브러리가 모두 동일한 API를 정의한 이유는 무엇입니까?

[email protected]:/lib$ objdump -T /lib/i386-linux-gnu/libc.so.6 |grep pthread_cond_signal 
000f8360 g DF .text 00000039 GLIBC_2.3.2 pthread_cond_signal 
0012b940 g DF .text 00000039 (GLIBC_2.0) pthread_cond_signal 

[email protected]:/lib$ objdump -T /lib/i386-linux-gnu/libpthread.so.0 |grep pthread_cond_signal 
0000b350 g DF .text 0000007c (GLIBC_2.0) pthread_cond_signal 
0000af90 g DF .text 000000fc GLIBC_2.3.2 pthread_cond_signal 

답변

10

libpthread.so도의 glibc의 일부입니다 스냅 샷, 그리고 둘 다 일부 기호의 (동일) 정의가 포함되어 있습니다.

대신 당신이 libpthread.so 만 현재의 것을 볼 수 있습니다 pthread_create 찾는 경우 -이 프로그램은 실제로 스레드 을 만들 libpthread.so에 연결해야하지만, 만 링크 단일 스레드 프로그램에서 뮤텍스와 조건 변수를 사용할 수 있다는 것을 의미 libc.so. 이는 공유 메모리에 존재하며 별도의 프로세스와 동기화하는 데 사용되는 프로세스 간 mutex 및 프로세스 간 조건 변수에 유용합니다. . (아래의 Zan Lynx의 의견 덕분에).

심볼을 모두 정의하더라도 libpthread.solibc.so에 링크하는 것은 문제가되지 않습니다. ELF 링커는 여러 공유 라이브러리가 동일한 심볼의 정의를 포함 할 수 있도록하며, 링커는 첫 번째 심볼을 선택하여 해당 심볼에 대한 모든 참조에 사용합니다 (symbol interposition). 여러 기호를 정의 할 수있는 또 다른 기능은 하나의 라이브러리에 동일한 이름의 약 기호가 아닌 weak symbols이 포함되어있는 경우입니다. 이 경우 에있는 두 라이브러리의 정의가 동일하기 때문에 libpthread.solibc.so에있는 라이브러리보다 우선합니다. 당신이 LD_DEBUG 를 사용하여 링커 인수의 순서를 변경하는 경우에는 기호가 실제로 발견 도착하는 라이브러리를 볼 수 있어야합니다.

뿐만 아니라 같은 기호를 정의하는 두 라이브러리는, 각 라이브러리는 두 개의 정의가를 기호가 다른 symbol versions, GLIBC_2.0GLIBC_2.3.2입니다. 이 심볼 버전 관리를 사용하면 여러 정의가 동일한 라이브러리에 공존 할 수 있으므로 새 기능의 향상된 버전이 이전 구현에 링크 된 코드를 손상시키지 않고 라이브러리에 추가됩니다. 이렇게하면 NPTL을 사용하는 LinuxThread 및 응용 프로그램을 사용하는 응용 프로그램에서 동일한 공유 라이브러리가 작동 할 수 있습니다. 라이브러리에 링크 할 때 참조가 바인딩되는 기본 기호는 해당 기능의 NPTL 구현에 해당하는 [email protected]_2.3.2입니다 (NPTL이 glibc 2.3.2에 처음 포함됨). 이전 기호 인 [email protected]_2.0은 NPTL을 제공하기 전에 기본 LinuxThreads 구현입니다. 구형 (2.3.2 이전) 버전의 glibc에 링크 된 응용 프로그램은 [email protected]_2.0에 바인딩되어 해당 기호가 사용됩니다.

+0

맞습니다. pthread_create는 libc.so.6에 정의되어 있지 않습니다. 하지만 왜 우리가 연결하는 동안 pthread_cond_signal에 대한 다중 정의 오류를 얻지 못합니까? –

+0

대답은 _symbol interposition_을 설명하도록 업데이트되었습니다. –

+7

나는이 답변이 완전히 정확하다고 생각하지 않습니다. glibc의 정의는 place-holder에만 있으며 pthread 작업에 대해서는 아무것도하지 않는 정의가 있습니다. libpthread.so의 정의가이를 재정의합니다. 이것은 단일 스레드에서 빠르기를 원하지만 다중 스레드 프로그램에서 스레드 안전성을 원하는 라이브러리에서 사용하기위한 것입니다. –

관련 문제