.a library dosyaları ve .so library dosyaları hangi amaçla kullanılır?

Başlatan mir_as82, 12 Ağustos 2015, 11:45:47

mir_as82

Linux ta bazı kütüphane dosyaları .a uzantılı bazıları ise .so uzantılı.
Bunların arasındaki fark nedir?
Hangi durumda .a dosyaları kullanılır hangi durumda .so dosyaları kullanılır?
Mümkünse örnek verebilirseniz memnun olurum.

Bu konu ile tam ilgili mi bilmiyorum ama ln -s komutu ile devamlı link verme işlemi yapılıyor bunun amacı  nedir? Örneğin ln -s /mnt/mtd/sunucu/openprograms /usr/lib/   



mufitsozen

Alıntı yapılan: mir_as82 - 12 Ağustos 2015, 11:45:47
Linux ta bazı kütüphane dosyaları .a uzantılı bazıları ise .so uzantılı.
Bunların arasındaki fark nedir?
Hangi durumda .a dosyaları kullanılır hangi durumda .so dosyaları kullanılır?
Mümkünse örnek verebilirseniz memnun olurum.

Bu konu ile tam ilgili mi bilmiyorum ama ln -s komutu ile devamlı link verme işlemi yapılıyor bunun amacı  nedir? Örneğin ln -s /mnt/mtd/sunucu/openprograms /usr/lib/   


bir benzetme yapmak gerekirse islev olarak:

-  .a dosyalari Windows'daki .lib dosyalarina benzer
- -.so dosyalarida Windows'daki .dll dosyalarina benzer.

.lib ve .dll dosyalarinin ne ise yaradigini ve kullanimdaki farklarini biliyorsaniz bu aciklama size yeterli olur.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

Tagli

.a dosyaları statik kütüphaneler, yani çalıştırılabilir dosyaya derleme sırasında ekleniyorlar. Program derlendikten sonra bu dosyalara ihtiyaç kalmıyor. Ama tabi derlenen kodun içine kondukları için kod boyutu artıyor.

.so dosyaları ise dinamik kütüphaneler. mufitsozen hocanın da bahsettiği üzere .dll dosyalarına benziyorlar. Bunlar derleme değil çalışma anında programa bağlanıyorlar. Bu sebeple program boyutu büyümüyor, ancak çalışabilmesi için bu dosyaların mevcut olması gerekiyor. Bazı kütüphaneler pek çok program tarafından kullanıldığı için bu tür bir yaklaşım daha mantıklı olabiliyor.
Gökçe Tağlıoğlu

mir_as82

Programa bağlanıyor derken hocam? .so kütüphanelerinin olduğu alandan çağrılarak mı çalıştırılıyorlar? Kafamdaki soru işareti şu, bu .so uzantılı derlenmiş dosyayı çalışma anında işletim sisteminin belli bir heap alanına kopyası oluşturulup (Yani sınıftan nesne oluşması gibi) bu kopya mı çalıştırılıyor. Veya 10 tane program bu .so uzantılı kütüphaneye ihtiyaç duyunca hepsi aynı alandaki .so dosyasından mı çalışıyor.

Örneğin bizim a programı ve b programı aynı anda ornek.so isimli kütüphane dosyasına ihtiyaç duysun. Bu durumda bu a ve b programları gidip ornek.so yu kendi stack alanlarına kopyalayıp mı çalıştırıyorlar Yoksa hiçbir zaman iki tane program aynı anda ornek.so ya erişemiyor mu?

mufitsozen

Alıntı yapılan: mir_as82 - 12 Ağustos 2015, 17:13:25
Programa bağlanıyor derken hocam? .so kütüphanelerinin olduğu alandan çağrılarak mı çalıştırılıyorlar? Kafamdaki soru işareti şu, bu .so uzantılı derlenmiş dosyayı çalışma anında işletim sisteminin belli bir heap alanına kopyası oluşturulup (Yani sınıftan nesne oluşması gibi) bu kopya mı çalıştırılıyor. Veya 10 tane program bu .so uzantılı kütüphaneye ihtiyaç duyunca hepsi aynı alandaki .so dosyasından mı çalışıyor.

Örneğin bizim a programı ve b programı aynı anda ornek.so isimli kütüphane dosyasına ihtiyaç duysun. Bu durumda bu a ve b programları gidip ornek.so yu kendi stack alanlarına kopyalayıp mı çalıştırıyorlar Yoksa hiçbir zaman iki tane program aynı anda ornek.so ya erişemiyor mu?

Hepsi ayni alandaki kodu paylasiyor. Dolayisi ile bu tip .so(shared object) deki moduller re-entrant olmasi lazim, ve/veya statik datanin erisiminin kontrollu olmasi lazim.

Bu stack alanina tasima diye birsey ben bugune kadar duymadim, gormedim. Bu konuda bilmem gereken birsey varsa lutfen referansini verirmisiniz? (isletim sistemi heap alanida ayri bir konu bilmedigim, onuda biraz acsaniz. Benim bildigim heap baska amaclarla kullanilir)
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

mir_as82

Hocam program değişkenleri stack segment te tutuluyor ben bunu kastetmek istemiştim. A programı, ornek.so dosyası içinde bir fonksiyon çağırsın, bu çağırma sırasında fonksiyonun değişkenleri A programına işletim sistemi tarafından ayrılan memory alanında(fonksiyonun yerel değişkenleri ve statik olmayan değişkenler) stack segmentte saklanmıyor mu?

Heap segmentte şu şekilde olmuyor mu.
Bir class düşünün bunun initialize edilmesi ile object oluşup bu object te heap alanında oluşturulmuyor mu?
İşletim sisteminin bizim programımıza ayırdığı, code segment, data segment, stack segment, heap segment(dinamik) gibi memory alanları var ve fonksiyonların yerel otomatik değişkenleri stack segmentte saklanılır, heap segmentte ise dinamik olan nesneler saklanır.

yamak

Alıntı YapHeap segmentte şu şekilde olmuyor mu.
Bir class düşünün bunun initialize edilmesi ile object oluşup bu object te heap alanında oluşturulmuyor mu?

Eger new ile allocate ediliyorsa evet. Yoksa local olarak tanimlanirsa class icindeki static olmayan tum attribute lar stack te,global tanimlanirsa ise data segmentte saklanir. Tipki diger data type lar gibi.