[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