[Gelistirici] PyGObject'te Undefined Symbols
Ozan Çağlayan
ozan at pardus.org.tr
21 Mayıs 2009 Per 19:26:28 EEST
Gökmen Görgen wrote:
> Merhabalar,
>
> Bu --as-needed olayini anlamaya calisirken bir turlu cozumunu
> bulamadigim sorunla karsilastim. Undefined symbols sorununu asmak icin
> autotools.autoreconf, libtools; --as-needed ve lpthread icin dosed
> kullanma gibi bircok yontem denememe ragmen, "ldd -u -r
> /usr/lib/libpyglib-2.0.so <http://libpyglib-2.0.so>" ciktisini
> temizleyemedim gitti:
Şöyle ki,
Bu undefined symbollerin as-needed'la alakası yok aslında. 2008 bir sistemde
ldd -u -r /usr/lib/*.so
dersen, yüzlerce undefined symbol görebilirsin.
Sorun underlinking diye tabir edilen bir hadise:
http://wiki.mandriva.com/en/Underlinking
Sadece bu undefined symbollerin olduğu bir kütüphane, LDFLAGS'lerinde
--as-needed default olan bir dağıtımda oldukça tehlikeli.
Kısaca, dinamik kütüphaneler, kötü autotools betikleri yüzünden, aslında
sembollerini kullandıkları bazı kütüphaneleri linklenmiyorlar. binutils
araçları buna izin veriyor. Senin örneğindeki kütüphanede o undefined
symbolleri sağlayan kütüphaneyle linklenmemiş ve bu yüzden -u -r
çıktısında bunu anlatıyor.
Çözüm, makefile.am veya makefile.in dosyalarında ilgili
değişikliği(likleri) yaparak bahsi geçen kütüphanenin linklenmesi
esnasında, undefined symbolleri sağlayan kütüphaneye de linklenmesini
sağlamak.
Senin örneğinde semboller /usr/lib/libpython2.5.so kütüphanesinden geliyor:
cyclope devel # objdump -tT /usr/lib/libpython2.5.so | grep
PyExc_ImportError
00102920 g DO .data 00000004 Base PyExc_ImportError
O zaman yapman gereken makefile dosyalarının birinde, ilgili yere
-lpython2.5 eklemek kabaca. Mandriva'nın deposunda her paket için olmasa
da çoğu paket için underlinking yamaları mevcut. Eğer bulamaz isen,
bizim depoda 10-15 tane var benim yaptığım. Genelde hepsine
"fix-underlinking.patch" adını koymuştum galiba.
Bir de ben sistemlerimde --as-needed'ın yanına, --no-undefined
koyuyorum. Bu flag, dinamik kütüphanelerde undefined symbol kalmasına
izin vermiyor, error veriyor. Bu sayede paketleme esnasında bu sorunu
yakalayabiliyorum. Bazen yamalamak oldukça zor ya da imkansız
olabiliyor, buraya sorabilirsin her zaman.
Bu arada sorunlu paketleri bir hataya yazmak çok güzel fikir, zamanla
temizlemeye çalışırız.
İyi akşamlar
Gelistirici mesaj listesiyle ilgili
daha fazla bilgi