2012-06-22 15 views
10

Neden glibc ve pthread kütüphanesi her ikisi de aynı API'yi tanımladı? İşteGlibc ve pthread kütüphaneleri neden aynı API'ları tanımladı?

[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 

cevap

10

libpthread.so çok glibc'nin parçası olan anlık olduğunu ve her ikisi de bazı sembollerin (özdeş) tanımlarını içerir.

yerine bunu libpthread.so sadece mevcut olduğunu göreceksiniz pthread_create için bakarsak - Bu programlar aslında konuları oluşturmak için libpthread.so bağlantı vermelidir, ama bu sadece bağlantı tek iş parçacıklı programlarında muteksleri ve durum değişkenleri kullanabilirsiniz demektir libc.so. Bu, paylaşılan bellekte yaşayan ve ayrı işlemler ile senkronize etmek için kullanılan süreçler arası işlenmemiş koşul ve interprocess koşul değişkenleri için kullanışlıdır. (Zan Lynx'in aşağıdaki yorumuyla düzeltmeler).

Her ikisi de sembolü tanımlasalar bile, libpthread.so ve libc.so numaralı bağlantılara bağlanmak sorun değildir. ELF bağlayıcıları, birçok ortak kütüphanenin aynı sembolün tanımlarını içermesine izin verir ve bağlayıcı, gördüğü ilk olanı seçer ve bu sembolle ilgili tüm referanslar için kullanır, buna symbol interposition adı verilir. Birden fazla sembolün tanımlanmasına izin veren bir diğer özellik ise, bir kitaplık aynı adı taşıyan zayıf olmayan sembollerle overidden olan weak symbols içeriyorsa. Bu durumda, 'daki iki kitaplık tanımları aynıdır, bu nedenle libpthread.so'un hangi amaçla kullanıldığı önemli değildir libc.so. Eğer LD_DEBUG kullanmak ve bağlayıcı için argümanlar sırasını değiştirirseniz sembol aslında bulundu alır hangi kütüphane görmek mümkün olmalıdır.

yanı sıra aynı sembolü tanımlayan iki kütüphaneler, her kütüphane iki tanım vardır Farklı symbol versions, GLIBC_2.0 ve GLIBC_2.3.2 ile sembolün. Bu sembol versiyonlama, aynı kütüphanede birden fazla tanımın bulunmasına izin verir, böylece eski uygulama ile bağlantılı olan kod kırmadan, işlevin yeni, geliştirilmiş sürümlerinin kütüphaneye eklenmesini sağlar. Bu, aynı paylaşımlı kütüphanenin, NPTh kullanarak LinuxThreads ve uygulamalarını kullanan uygulamalar için çalışmasına izin verir. Bir başvurunun kütüphaneye bağlanırken bağlanacağı varsayılan simge, [email protected]_2.3.2 (NPTL) işlevinin uygulamasına karşılık gelir (NPTL ilk olarak glibc 2.3.2'ye dahil edilmiştir). Eski sembol, [email protected]_2.0, NPTL'nin sağlanmasından önceki varsayılan olan eski LinuxThreads uygulamasıdır. Daha eski (2.3.2 öncesi) glibc sürümleriyle bağlantılı uygulamalar [email protected]_2.0'a bağlanır ve bu sembolü kullanır.

+0

Haklısınız, pthread_create libc.so.6'da tanımlanmamıştır. Ama neden bağlantı sırasında pthread_cond_signal için çoklu tanım hatası almıyoruz? –

+0

cevap _symbol interposition_ –

+7

'u tanımak için güncellenmiş Bu cevabın tamamen doğru olduğuna inanmıyorum. Glibc'deki tanımlamalar yalnızca yer tutuculardır ve pthread işlemleri için yalnızca boş hiçbir şey yapma tanımları yoktur. Libpthread.so'daki tanımlamalar bunları geçersiz kılar. Bu, çok iş parçacıklı programlarda tek iş parçacıklı, ancak iş parçacığı güvenli bir şekilde hızlı olmak isteyen kitaplıkların kullanımı içindir. –

İlgili konular