libinstagram
Transkript
libinstagram
Galatasaray Üniversitesi Bilgisayar Mühendisliği Bölümü INF203 – Algoritma & C TP02: Uygulama Geliştirme Temelleri Ozan Çağlayan ocaglayan@gsu.edu.tr ozancaglayan.com Kaynak Koddan Programa... #include <stdio.h> int main(int argc, char *argv[]) { printf(“Hello world!\n”); return 0; } hello.c Kaynak Koddan Programa... hello.c hello.i Önişlemci hello.s Derleyici Assembler Kaynak Kod Önişlenmiş Kod Assembly Kodu hello.o Object Kodu Çalıştırılabilir Program hello ı c ı y a Bağl Kaynak Koddan Programa... $ gcc -save-temps hello.c -o hello $ ls hello hello.c hello.i hello.o hello.s $ ./hello Hello world! ● -save-temps parametresi ara dosyaların silinmemesini sağlar. Kaynak Koddan Programa... ● Pratikte bir program birden fazla kaynak dosyasından oluşur: – firefox.c Firefox'un main() fonksiyonu – css.c CSS Motoru – js.c JavaScript Motoru – html.c HTML Ayıklayıcı – ... Kaynak Koddan Programa... ● Pratikte bir program birden fazla kaynak dosyasından oluşur: $ gcc -c firefox.c css.c js.c html.c $ ls *.o firefox.o css.o js.o html.o ● -c parametresi kaynak kodların derlenip, assemble edilip, bağlanmadan object kodu olarak (.o) bırakılacağını söyler. Kaynak Koddan Programa... ● Pratikte bir program birden fazla kaynak dosyasından oluşur: $ gcc -o firefox firefox.o css.o js.o html.o $ ls firefox firefox.o css.o js.o html.o ● -o parametresi object kodların bağlayıcı (linker) tarafından bağlanarak sonuç dosyasının üretilmesini söyler. Tekrar Kullanılabilirlik ● ● Instagram firmasında çalıştığımızı hayal edelim... Filtreleri ayrı C dosyaları olarak geliştirmek mantıklı: – amaro.c – rise.c – hudson.c – ... Tekrar Kullanılabilirlik ● Yaklaşım 1 Filtrelerin kaynak kodlarını bir kere Object koduna dönüştürüp, çalıştırılabilir dosya üretirken kullanabiliriz: $ gcc -o instagram instagram.o rise.o hudson.o amaro.o x-pro.o .... <yüzlerce filtre> ... – Çok fazla .o dosyası, – Her seferinde tek tek adlarının yazılması zor. Nesne (Object) Kitaplıkları ● .o uzantılı Object dosyalarını bünyesinde barındıran tek bir dosya: amaro.o rise.o hudson.o Instagram Object Library x-pro.o Statik Kitaplıklar ● ● Statik kitaplıklar birden fazla .o dosyasını içeren özel biçimli bir arşivden başka bir şey değildir, Uzantı: .a – libinstagram.a – libmpeg.a MPEG kitaplığı – libpng.a PNG kitaplığı – ... Statik Kitaplıklar ● ● Instagram filtrelerini kullandığınız bir uygulama geliştirdiğinizde, ilgili kitaplıktan istediğiniz fonksiyonları çağırır, Derleme esnasında instagram statik kitaplığını gcc'ye parametre olarak verip kitaplığın uygulamanın içine gömülmesini sağlarsınız: $ gcc my_instagram.c -linstagram libinstagram.a ile bağla Statik Kitaplığın Dezavantajları ● JPEG dosyalarını okumak isteyen yüzlerce uygulamanın hepsi libjpeg ile statik bağlanırsa: Statik Kitaplığın Dezavantajları ● JPEG dosyalarını okumak isteyen yüzlerce uygulamanın hepsi libjpeg ile statik bağlanırsa: – Her uygulama aynı object dosyalarını içereceğinden: Disk israfı Statik Kitaplığın Dezavantajları ● JPEG dosyalarını okumak isteyen yüzlerce uygulamanın hepsi libjpeg ile statik bağlanırsa: – Her uygulama aynı object dosyalarını içereceğinden: Disk israfı – libjpeg ile bağlanmış farklı uygulamalar aynı anda çalışıyorsa aynı object dosyaları hepsinin belleğinde yer harcayacağından: Bellek israfı Statik Kitaplığın Dezavantajları ● JPEG dosyalarını okumak isteyen yüzlerce uygulamanın hepsi libjpeg ile statik bağlanırsa: – Her uygulama aynı object dosyalarını içereceğinden: Disk israfı – libjpeg ile bağlanmış farklı uygulamalar aynı anda çalışıyorsa aynı object dosyaları hepsinin belleğinde yer harcayacağından: Bellek israfı – Statik kitaplıkta değişiklik gerektiğinde onu içeren tüm programlar tekrar oluşturulmalı! Dinamik (Paylaşımlı) Kitaplıklar ● Statik kitaplıkların ciddi eksikliklerini karşılamak için tasarlanan dinamik kitaplıklar: – Programın içine gömülmek yerine diskte tek bir yerde bulunurlar, – libinstagram ile dinamik bağlanan uygulama çalıştırıldığında diskteki kitaplık belleğe yüklenir, – libinstagram ile dinamik bağlanan diğer uygulamalar da bellekteki kopyayı kullanırlar. Statik vs Dinamik ● ● ● Uzantı: .a (.lib) Her programa tek tek gömülür, Programın diskteki boyutunu ve belleğe yüklendiğinde harcadığı belleği arttırır. Statik ● ● ● Uzantı: .so (.dll) Diskte durur, her programa tek tek gömülmez, Program çalıştığından diskten belleğe yüklenir. Dinamik Pratik ● ● file komutu dosyalar hakkında bilgi verir, ldd komutu, programların hangi dinamik kitaplıklara bağlı olduklarını gösterir. Pratik ● ● file komutu dosyalar hakkında bilgi verir, ldd komutu, programların hangi dinamik kitaplıklara bağlı olduklarını gösterir. $ which cat /usr/bin/cat $ file /usr/bin/cat /usr/bin/cat: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), ... Pratik ● ● file komutu dosyalar hakkında bilgi verir, ldd komutu, programların hangi dinamik kitaplıklara bağlı olduklarını gösterir. $ ldd /usr/bin/cat linux-vdso.so.1 => (0x00007fff7ebfe000) libc.so.6 => /lib64/libc.so.6 (0x00000037fc600000) /lib64/ld-linux-x86-64.so.2 (0x00000037fc200000) Pratik ● ● file komutu dosyalar hakkında bilgi verir, ldd komutu, programların hangi dinamik kitaplıklara bağlı olduklarını gösterir. $ ldd /usr/bin/cat linux-vdso.so.1 => (0x00007fff7ebfe000) libc.so.6 => /lib64/libc.so.6 (0x00000037fc600000) /lib64/ld-linux-x86-64.so.2 (0x00000037fc200000) Standart C Kitaplığı: libc Pratik ● ● file komutu dosyalar hakkında bilgi verir, ldd komutu, programların hangi dinamik kitaplıklara bağlı olduklarını gösterir. $ file /usr/sbin/sln /usr/sbin/sln: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, ... $ ldd /usr/sbin/sln not a dynamic executable Galatasaray Üniversitesi Bilgisayar Mühendisliği Bölümü Sorusu olan? Ozan Çağlayan ocaglayan@gsu.edu.tr ozancaglayan.com Referans Kitap The Linux Programming Interface Michael Kerrisk