libinstagram

Transkript

libinstagram
Galatasaray Üniversitesi
Bilgisayar Mühendisliği Bölümü
INF203 – Algoritma & C
TP02: Uygulama Geliştirme Temelleri
Ozan Çağlayan
[email protected]
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
[email protected]
ozancaglayan.com
Referans Kitap
The Linux Programming
Interface Michael
Kerrisk

Benzer belgeler