ACIK KAYNAK
 
*
Merhaba, Ziyaretçi. Lütfen giriş yapın veya üye olun. Aralık 02, 2008, 03:14:29 ÖS


Kullanıcı adınızı, parolanızı ve aktif kalma süresini giriniz



Reklamlar
Sayfa: [1]   Aşağı git
  Yazdır  
Gönderen Konu: GCC,GDB,Make,Ltrace Kullanımları  (Okunma Sayısı 187 defa)
0 Üye ve 1 Ziyaretçi konuyu incelemekte.
Metaponte
Global Moderator
***
Offline Offline

Cinsiyet: Bay
Mesaj Sayısı: 122



Üyelik Bilgileri
« : Ocak 16, 2008, 11:52:49 ÖÖ »

M.Ali VARDAR 2003-2005 – GCC Kullanımı
GCC Kullanımı GCC harfleri GNU Compiler Collection kelimlerinin baş harflerinden oluşur. Gerçek
ismini GNU C Compiler kelimelerinden almaktadır. Bu değişikliğin sebebi GCC
eskiden sadece C derleyicisinden oluşmakta olduğudur. Diğer diller daha sonradan GCC
ailesine eklenmiştir. Bu konuda bilgi için ;
http://en.wikipedia.org/wiki/GNU_Compiler_Collection adresine bir ziyaret yapılabilir.
http://gcc.gnu.org/ adresinden GCC son sürümleri takip edebilirsiniz.
GCC sürümünüzü öğrenmek için;
bash-2.05b# gcc -v
Reading specs from /usr/lib/gcc-lib/i386-slackware-linux/3.2.2/specs
Configured with: ../gcc-3.2.2/configure --prefix=/usr --enable-shared
--enable-threads=posix --enable-__cxa_atexit --disable-checking --withgnu-
ld --verbose --target=i386-slackware-linux --host=i386-slackwarelinux
Thread model: posix
gcc version 3.2.2
Benim sistemimde dönen sonuç yukarıdaki şekildedir.
Derleyicinin uygulamaları doğru bir şekilde derlemesi için bir takım
parametrelerin doğru olarak verilmesi gerekmektedir. En basit şekli
ile uygulamamızı yazalım ve ilk derleme işlemimize geçelim.
#include <stdio.h>
int main()
{
printf("Örnek uygulama");
}
Yukarıdaki en basit uygulamamızdan başlamış olduk. Şimdi bu uygulamamızı derlemeye
geçelim. Uygulamayı istediğimiz bir editör ile yazdıktan sonra ilk.c olarak kayededelim
ve aşağıdaki satırları yazalım.
#gcc ilk.c
Bu satırdan sonra uygulamada hata yok ise veya bir uyarı mesajı vermezse uygulam
derlenir. Kaynak kodun olduğu dizine bakıldığı zaman a.out isimli bir dosyanın oluştuğu
görülecektir. Uygulamamızı bir isim vermeden derledik bu gibi durumlarda gcc
varsayılan olarak a.out dosya adını kullanacaktır. Şimdide uygulamamızı kendi ismiyle
derleyelim. Bu amaçla -o parametresi kullanılacaktır. -o parametresi çıkış dosya adını
belirtmektedir.
#gcc ilk.c -o ilk
Komut satırından sonra ilgili dizin içerisinde artık bir ilk isimli çalıştırılabilir dosya
oluşacaktır. Bu aşamadan sonra artık basit bir uygulamanın derlenmesi işlemi anlaşılmış
oldu. Peki ya uygulama içerisinde dışarıdan bir takım kitaplıklar eklenmek istenirse nasıl
M.Ali VARDAR 2003-2005 – GCC Kullanımı
derlenmelidir? Bu aşamada örnek basit uygulamamız üzerinde bir iki ufak değişiklik
yapalım;
#include <ncurses.h>
int main()
{
initscr();
getch();
endwin();
printf("bitti\n");
}
Standart kitaplıklar kullanıldığı zaman getch() fonksiyonu yoktur. Ancak eğer ncurses
kullanılması durumunda bu komut mevcuttur. Dikkat edilecek olursa stdio.h
uygulamaya eklenmedi. Ön bilgi olarak ncurses.h kullanılması durumunda stdio.h
kullanılmasına gerek yoktur. Bu uygulamayı aynı şekilde aşağıdaki ilk öğrendiğimiz
standart derleme yöntemi ile derleyelim.
# gcc ilk.c -o ilk
/tmp/cchah5Wx.o: In function `main':
/tmp/cchah5Wx.o(.text+0x7): undefined reference to `initscr'
/tmp/cchah5Wx.o(.text+0x10): undefined reference to `stdscr'
/tmp/cchah5Wx.o(.text+0x15): undefined reference to `wgetch'
/tmp/cchah5Wx.o(.text+0x1d): undefined reference to `endwin'
collect2: ld returned 1 exit status
GCC bize bir çok tanımlanmamış komut olduğunu hata olarak vermektedir. Aslında
bunlar hata değil bunu biliyoruz ancak bu komutlar ncurses kitaplığı içerisindedir. Bizim
yapmamız gereken ncurses kitaplığının bayrağını derleme parametresine eklemek
olacaktır.
# gcc ilk.c -o ilk -lncurses
Bu komuttan sonra uygulama hata vermeden derleme işlemini gerçekleştirecektir. Önemli
hatırlatma, uygulamaya eklenecek olan kitaplıklar ve kütüphaneler eğer sistemde standart
olan yerlerde mevcut ise ki bu standart yerler nerelerdir. Bu tanım dağıtımlara göre
farklılıklar gösterebilir ancak tüm kütüphanelere ait ekleme dizinleri genel olarak
/usr/include içindedir. Eğer bu başlık dosyaları farklı bir yerde oldukları belirtilmek
istenmesi durumunda farklı bir parametre daha eklemektedir.
# gcc ilk.c -o ilk -I/usr/include -lncurses
satırı da aynı şekilde uygulamamızı sorunsuz olarak derleyecektir. Burada uygulamamız
içine eklenen başlık dosyalarını araması için standart path dışında /usr/include dizinini
de eklemiş olduk. Şu aşamadan itibaren ncurses kitaplıklarını uygulamamız içerisine
ekleyebiliyoruz ve istediğimiz ncurses komutlarını kullanabiliriz. Bunun yanında mysql
kitaplıklarını da uygulamaya katmak istersek uygulamamızı aşağıdaki şekle sokalım;
M.Ali VARDAR 2003-2005 – GCC Kullanımı
#include <ncurses.h>
#include <mysql.h>
int main()
{
initscr();
getch();
endwin();
printf("bitti\n");
}
En son derleme satırımız ile derleyelim. Aynı zamanda -lmysql ile mysql kitaplıklarını
kullanacağımızı belirtelim.
# gcc ilk.c -o ilk -I/usr/include -lncurses -lmysql
ve sonuç;
ilk.c:2:19: mysql.h: No such file or directory
neden mysql.h bulamadı halbuki -I/usr/include yazdık, peki sistemde ufak bir arama
yapalım bakalım doğrumu yazdık?
# locate mysql.h
/usr/share/apps/quanta/doc/php/ref.mysql.html
/usr/include/mysql/mysql.h
işte aradığımız satır. mysql.h dosyası /usr/include/mysql dizini için de bulunmakta
imiş öyleyse derleme parametresinde bir değişiklik yapalım.
# gcc ilk.c -o ilk -I/usr/include -I/usr/include/mysql -lncurses -lmysql
ve sonuç başarılı olacaktır. Bu şekilde istendiği kadar
kitaplığı uygulamamız içerisine ekleyebiliriz. Eğer aranan uygulama farklı bir dizin
içerisinde ise öyleyse -L parametresi ile bu kütüphanenin yolunu tanımlamalıyız. Örnek
olarak;
# gcc ilk.c -o ilk -I/usr/include -I/usr/include/mysql -L/usr/local/lib
-lncurses -lmysql
Aynı şekilde matematik kütüphanesini uygulamamızda kullanacaksak -lm eklemeliyiz.
şifreleme algoritmasını kullanacaksak -lcrypt, postgresql için -lpq, thread kullanımı
için -lpthread, glib kütüphanesini kullanmak için -lglib, vga kitaplıklarını kullanmak
için -lvga örnek olarak verebiliriz. Bu kullanım örnekleri sisteminize kurduğunuz
kitaplıkların miktarına göre değişmektedir. Şimdide GCC ile kullanabileceğimiz bir
takım parametrelere gelelim. -m parametresi CPU seçimli olara derleme işlemini
gerçekleştirmektedir.
386 komut seti için -m386
486 komut seti için -m486
pentium komut seti için -mpentium parametresi verilmelidir. Örnek olarak;
# gcc ilk.c -o ilk -I/usr/include -I/usr/include/mysql -lncurses
-lmysql -mpentium
M.Ali VARDAR 2003-2005 – GCC Kullanımı
komutu sonrası uygulama pentium işlemci için derlenmiş olacaktır. 486 seçimli derleme
işleminden sonra özellikle büyük uygulamalardan sonra kodda bir miktar büyüme
olabilir, ancak bu hız ile ters orantılı olarak artırmaktadır. Diğer önemli bir kullanım şekli
uygulamaya eklenmiş olan kitaplıkları statik olarak uygulama içerisine eklemektir. Bu
şekilde uygulama çalıþtırılabilir kod içerisine kitaplıklarda eklenecektir. Bu işlemi örnek
uygulamamız içinde deneyelim;
# gcc ilk.c -o ilk -I/usr/include -I/usr/include/mysql -lncurses
-lmysql -mpentium -static
Her iki farklı derleme şeklinden sonra uygulamanın büyüklüğüne dikkat ediniz,
büyüklüğünde epey bir fark olduðu görülecektir. Uygulama içerisinde verilen hata
mesajları haricinde bir takım uyarı mesajları bulunmaktadır. Örnek olarak göstereceğimiz
var olan değişkenin tanımlanmış olmasına rağmen kullanılmaması gibi;
Uygulama içerisinde bir değişken tanımlayalım ve derleyelim; Derleme parametresine ek
olarak -Wall parametresini ekleyelim.
gcc ilk.c -o ilk -I/usr/include -I/usr/include/mysql -lcurses -Wall
ilk.c: In function `main':
ilk.c:5: warning: unused variable `a'
ilk.c:10: warning: control reaches end of non-void function
aşağıdaki şekilde karşımıza uyarı mesajları çıkmaya başlayacaktır. Eğer uygulama
içerisinde optimizasyon yapılmasına önem verilmesi durumunda bu gereksiz olan
değişkenler temizlenmelidir. -w parametresi ile birlikte tüm uyarı mesajlarının ekrana
çıkmasına engel olunur. GCC aynı zamanda kendi içerisinde yazılmış olan kodlar
üzerinde optimizasyon yapmaktadır. Bu amaçla -O parametresi kullanılmaktadır. Örnek
uygulamamızı aşağıdaki şekilde derleyelim.
# gcc ilk.c -o ilk -I/usr/include -I/usr/include/mysql -lcurses -O1
Bu parametre -O0, -O1, -O2, -O3 değerlerini alabilir. 0 hiç optimize yaptırmazken 3 en
optimize hali ile uygulama kodunu düzenler.
M.Ali VARDAR
ali@linuxprogramlama.com
Bu yazının son şeklini www.linuxprogramlama.com adresinden temin edebilirsiniz.
Yasal Açıklama:
Bu belgenin, [GCC Kullanımı ]1.0 sürümünün telif hakkı © 2005 M. Ali Vardar'a aittir. Bu belgeyi,
Free Software Foundation tarafından yayınlanmış bulunan GNU Özgür Belgeleme Lisansının 1.1
ya da daha sonraki sürümünün koşullarına bağlı kalarak kopyalayabilir, dağıtabilir ve/veya
değiştirebilirsiniz. Bu Lisansın bir kopyasını http://www.gnu.org/copyleft/fdl.html adresinde
bulabilirsiniz.
BU BELGE "ÜCRETSİZ" OLARAK RUHSATLANDIĞI İÇİN, İÇERDİĞİ BİLGİLER İÇİN
İLGİLİ KANUNLARIN İZİN VERDİĞİ ÖLÇÜDE HERHANGİ BİR GARANTİ
VERİLMEMEKTEDİR. AKSİ YAZILI OLARAK BELİRTİLMEDİĞİ MÜDDETÇE TELİF
HAKKI SAHİPLERİ VE/VEYA BAŞKA ŞAHISLAR BELGEYİ "OLDUĞU GİBİ", AŞİKAR
VEYA ZIMNEN, SATILABİLİRLİĞİ VEYA HERHANGİ BİR AMACA UYGUNLUĞU DA
M.Ali VARDAR 2003-2005 – GCC Kullanımı
DAHİL OLMAK ÜZERE HİÇBİR GARANTİ VERMEKSİZİN DAĞITMAKTADIRLAR.
BİLGİNİN KALİTESİ İLE İLGİLİ TÜM SORUNLAR SİZE AİTTİR. HERHANGİ BİR
HATALI BİLGİDEN DOLAYI DOĞABİLECEK OLAN BÜTÜN SERVİS, TAMİR VEYA
DÜZELTME MASRAFLARI SİZE AİTTİR. İLGİLİ KANUNUN İCBAR ETTİĞİ
DURUMLAR VEYA YAZILI ANLAŞMA HARİCİNDE HERHANGİ BİR ŞEKİLDE TELİF
HAKKI SAHİBİ VEYA YUKARIDA İZİN VERİLDİĞİ ŞEKİLDE BELGEYİ DEĞİŞTİREN
VEYA YENİDEN DAĞITAN HERHANGİ BİR KİŞİ, BİLGİNİN KULLANIMI VEYA
KULLANILAMAMASI (VEYA VERİ KAYBI OLUŞMASI, VERİNİN YANLIŞ HALE
GELMESİ, SİZİN VEYA ÜÇÜNCÜ ŞAHISLARIN ZARARA UĞRAMASI VEYA
BİLGİLERİN BAŞKA BİLGİLERLE UYUMSUZ OLMASI) YÜZÜNDEN OLUŞAN GENEL,
ÖZEL, DOĞRUDAN YA DA DOLAYLI HERHANGİ BİR ZARARDAN, BÖYLE BİR
TAZMİNAT TALEBİ TELİF HAKKI SAHİBİ VEYA İLGİLİ KİŞİYE BİLDİRİLMİŞ OLSA
DAHİ, SORUMLU DEĞİLDİR.
Tüm telif hakları aksi özellikle belirtilmediği sürece sahibine aittir. Belge içinde geçen herhangi bir
terim, bir ticari isim ya da kuruma itibar kazandırma olarak algılanmamalıdır. Bir ürün ya da
markanın kullanılmış olması ona onay verildiği anlamında görülmemelidir.
« Son Düzenleme: Ocak 16, 2008, 11:57:33 ÖÖ Gönderen: Metaponte » Logged

Metaponte
Global Moderator
***
Offline Offline

Cinsiyet: Bay
Mesaj Sayısı: 122



Üyelik Bilgileri
« Yanıtla #1 : Ocak 16, 2008, 11:54:18 ÖÖ »

GNU Debugger Kullanımı
GDB Kullanımı Uygulamalarımızı geliştirme sırasında gerek sistemden olsun gerek programcı tarafından
olsun gelen bir takım sinyaller veya kesmeler veya hatalar yüzünden uygulamamızın
çalışmasında kesilmeler olabilir. Bu gibi zamanlarda çoğu zaman tahmin edebiliyor
olmak yeterli olmayabilir. Bu gibi durumlarda en büyük yardımcımız gdb olacaktır. Linux
sistemlerde yaygın olarak gnu debugger isimli uygulama kullanılır. Bu uygulama ile
uygulamanızın kodu veya core dosyası incelenebilir. Öncelikle derleme işlemine bir
bakalım.
gcc -g deneme.c -o deneme
Derleme işleminden sonra uygulamanın normal -g parametresiz büyüklüğünden fazla
olduğu görülecektir. Bu aşamadan sonra derlenen uygulama debug işlemleri için gerekli
olan açıklamaları da binary içerisine katmaktadır. Hata veren örnek bir uygulama
yazalım. Örnek uygulama içerisinde değişiklik yapalım ve ugulamanın hata vermesini
sağlayalım.
int main()
{
int a[5];
int i=0;
duzenle(a);
}
void duzenle(int a[])
{
int i;
for (i=0;i<10000;i++) a=i;
}
Uygulamamız
for (i=0;i<9000;i++) a=i;
satırında hata vermektedir. Çünkü bu satırda hafıza için ayrılmış olan 5 integer
miktarındaki alana 10000 nci integer değerine erişilmeye çalışılmaktadır. Uygulama ilk
çalıştırıldığı anda segmentation failed hatası verecektir. Bu kadar kısa bir kod içerisinde
bunu bulmak sorun olmayacaktır. Ancak uygulamanında iç içe çağrımlarda bulunan
100.000 satır bir uygulama olduğunu düşünürseniz bu gibi bir hatanın bulunması
programcıyı epey zorlayacaktır. Uygulamaya tekrar geri dönelim uygulamayı şimdi
aşağıdaki şekilde çalıştıralım.
[root@linuxprogramlama 1]# gdb deneme
GNU gdb Red Hat Linux (5.1.90CVS-5)
Copyright 2002 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and
you are welcome to change it and/or distribute copies of it under
certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for
details.
This GDB was configured as "i386-redhat-linux"...
(gdb)
gdb ilk çalıştığı zaman yukarıdaki şekilde bir karşılama mesajı karşımıza çıkacaktır.
Uygulama çalıştırılabilir dosyası gdb yüklenmiş olacaktır. Uygulama r komutu ile
çalıştıralım ve karşımıza çıkan mesaja bir bakalım.
(gdb) r
M.Ali VARDAR – 2005 GNU Debugger Kullanımı
Starting program: /Projects/Kurs/1/deneme
Program received signal SIGSEGV, Segmentation fault.
0x08048418 in duzenle (a=0xbffff970) at deneme.c:12
12 for (i=0;i<9000;i++) a=i;
İşte gdb bize hata veren satırımızı ekrana yazdı. Açıklamanın başında bulunan 12 rakamı
bize uygulama kodumuz içerisinde hatayı veren satırdır. Şimdi hatanın oluşma süreçlerine
bakalım bu amaçla bt (backtrace) komutunu kullanıyoruz.
(gdb) bt
#0 0x08048418 in duzenle (a=0xbffff970) at deneme.c:12
#1 0x080483e9 in main () at deneme.c:6
#2 0x0000000b in ?? ()
Cannot access memory at address 0xa
(gdb)
Böylece en sade halde uygulamamızda bulunan hataları izleme yöntemini gördük. Şimdi
de daha etkin bir şekilde GNU debugger kullanabilmek amacıyla bir takım komutlara
göz atalım.
list komutu bize hataya neden olan satırın bulunduğu komut listesini verecektir.
(gdb) list
7 }
8
9 void duzenle(int a[])
10 {
11 int i;
12 for (i=0;i<9000;i++) a=i;
13 }
(gdb)
Değişkenler hakkında bilgi almak için print komutu kullanılır.
(gdb) print a[5]
$2 = 5
(gdb)
Değişken tipini öğrenmek için whatis komutu kullanılır.
(gdb) whatis a
type = int *
Peki bir koşul oluşması durumunda istenen değişken bilgilerini almak istesek ne
yapmamız gerekir bu amaçla uygulamanın çalışma anında durdurulmasını sağlayacak bir
kırılma noktası yerleştirmeliyiz.
(gdb) break 12
Breakpoint 1 at 0x80483f6: file deneme.c, line 12.
(gdb) r
Starting program: /Projects/Kurs/1/deneme
Breakpoint 1, duzenle (a=0xbffff970) at deneme.c:12
12 for (i=0;i<9000;i++) a=i;
(gdb) print i
$1 = 0
yukarıdaki şekilde 12 satıra bir kırılma noktası yerleştirdik ve o anki
i değerine baktık diğer bir şartlı kırılma noktasına örnek ise;
(gdb) break 12 if i==5
Breakpoint 1 at 0x80483f6: file deneme.c, line 12.
(gdb)
görüldüğü üzere i değişkeni 12 satırda 5 değerine ulaştığı an uygulama kesilecektir.
M.Ali VARDAR – 2005 GNU Debugger Kullanımı
Makina dili kodlarını kodlarını öğrenmek için verilen iki bellek arasını yazdırmak için
(gdb) disas 0x63e4 0x6404
Dump of assembler code from 0x63e4 to 0x6404:
0x63e4 <builtin_init+5340>: ble 0x63f8 <builtin_init+5360>
0x63e8 <builtin_init+5344>: sethi %hi(0x4c00), %o0
0x63ec <builtin_init+5348>: ld [%i1+4], %o0
0x63f0 <builtin_init+5352>: b 0x63fc <builtin_init+5364>
0x63f4 <builtin_init+5356>: ld [%o0+4], %o0
0x63f8 <builtin_init+5360>: or %o0, 0x1a4, %o0
0x63fc <builtin_init+5364>: call 0x9288 <path_search>
0x6400 <builtin_init+5368>: nop
End of assembler dump.
Kesilmiş olan yerden devam etmek aşağıdaki gibi c komutu vermek gereklidir.
(gdb) c
Continuing.
Debugger dan çıkmak için quit veyahutta q yazınız. Aynı zamanda uygulamanızın core
dosyasını da #gdb programcoredosyasi şeklinde kullanarak hata veren yeren yeri
bulabilirsiniz
M.Ali VARDAR – 2005 Ocak
ali@linuxprogramlama.com
www.linuxprogramlama.com
Yasal Açıklama:
Bu belgenin, [GDB Kullanımı] 1.0 sürümünün telif hakkı © 2005 M. Ali
Vardar'a aittir. Bu belgeyi, Free Software Foundation tarafından
yayınlanmış bulunan GNU Özgür Belgeleme Lisansının 1.1 ya da daha
sonraki sürümünün koşullarına bağlı kalarak kopyalayabilir, dağıtabilir
ve/veya değiştirebilirsiniz. Bu Lisansın bir kopyasını
http://www.gnu.org/copyleft/fdl.html adresinde bulabilirsiniz.
BU BELGE "ÜCRETSİZ" OLARAK RUHSATLANDIĞI İÇİN, İÇERDİĞİ BİLGİLER İÇİN
İLGİLİ KANUNLARIN İZİN VERDİĞİ ÖLÇÜDE HERHANGİ BİR GARANTİ
VERİLMEMEKTEDİR. AKSİ YAZILI OLARAK BELİRTİLMEDİĞİ MÜDDETÇE TELİF HAKKI
SAHİPLERİ VE/VEYA BAŞKA ŞAHISLAR BELGEYİ "OLDUĞU GİBİ", AŞİKAR VEYA
ZIMNEN, SATILABİLİRLİĞİ VEYA HERHANGİ BİR AMACA UYGUNLUĞU DA DAHİL
OLMAK ÜZERE HİÇBİR GARANTİ VERMEKSİZİN DAĞITMAKTADIRLAR. BİLGİNİN
KALİTESİ İLE İLGİLİ TÜM SORUNLAR SİZE AİTTİR. HERHANGİ BİR HATALI
BİLGİDEN DOLAYI DOĞABİLECEK OLAN BÜTÜN SERVİS, TAMİR VEYA DÜZELTME
MASRAFLARI SİZE AİTTİR. İLGİLİ KANUNUN İCBAR ETTİĞİ DURUMLAR VEYA
YAZILI ANLAŞMA HARİCİNDE HERHANGİ BİR ŞEKİLDE TELİF HAKKI SAHİBİ VEYA
YUKARIDA İZİN VERİLDİĞİ ŞEKİLDE BELGEYİ DEĞİŞTİREN VEYA YENİDEN DAĞITAN
HERHANGİ BİR KİŞİ, BİLGİNİN KULLANIMI VEYA KULLANILAMAMASI (VEYA VERİ
KAYBI OLUŞMASI, VERİNİN YANLIŞ HALE GELMESİ, SİZİN VEYA ÜÇÜNCÜ
ŞAHISLARIN ZARARA UĞRAMASI VEYA BİLGİLERİN BAŞKA BİLGİLERLE UYUMSUZ
OLMASI) YÜZÜNDEN OLUŞAN GENEL, ÖZEL, DOĞRUDAN YA DA DOLAYLI HERHANGİ
BİR ZARARDAN, BÖYLE BİR TAZMİNAT TALEBİ TELİF HAKKI SAHİBİ VEYA İLGİLİ
KİŞİYE BİLDİRİLMİŞ OLSA DAHİ, SORUMLU DEĞİLDİR.
Tüm telif hakları aksi özellikle belirtilmediği sürece sahibine aittir.
Belge içinde geçen herhangi bir terim, bir ticari isim ya da kuruma
itibar kazandırma olarak algılanmamalıdır. Bir ürün ya da markanın
kullanılmış olması ona onay verildiği anlamında görülmemelidir.
Logged

Metaponte
Global Moderator
***
Offline Offline

Cinsiyet: Bay
Mesaj Sayısı: 122



Üyelik Bilgileri
« Yanıtla #2 : Ocak 16, 2008, 11:55:23 ÖÖ »

Make Kullanımı nasıldır?
Make Kullanımı
GCC ile uygulama derlerken, kullanılan kitaplıkların sayısı artabilmektedir. Bu sayı
ile orantılı ilgili kitaplıklara ait dizinler değişebilir. Aynı zamanda uygulamaya dahil
olan dosya sayısı artabilir. Bu değerleri parametre olarak vererek her seferinde GCC
ile uygulama derlemek uygulama geliştirme süreci çekilmez bir hale getirecektir.
Make ile ilgi örnekler c diline göre verilmiştir. Make konsolda çalışan tüm dilleri
desteklemektedir.
Make genel olarak projenin derlenmesi, kurulması, sistemden kaldırılması,
derlenmiş olan dosyaları silmesi gibi sıklıkla yapılan işlemleri baitleştirmeye yarar.
Konsolda Make komutuna basit bir parametre vererek bu işlemler veya özel
komutlar gerçekleştirilebilir. En basit kullanımı konsolda make yazılması ile
gerçekleşir. Make komutunu verilebilecek parametreler aşağıdaki şekildedir. En sık
kullanılan yöntemler ise
make
make clean
make install
biçimindedir. Bu parametreler makefile dosyası içinde bulunan ilgili alanları
çalıştırmaktadır.
f
parametresi ile özel bir isme sahip makefile dosyası işletilebilir.
n
çalıştırılan komutları gösterir.
s
çalıştırılan komutları göstermez.
j
eş zamanlı çalıştırılacak komut miktarı tanımlanır. Örnek j4
Proje dizini içinde make komutu verilmesi durumunda, make öncelikle bulunulan
dizin içinde, GNUmakefile, Makefile veya makefile dosyalarından birini arar. Bu
dosya hemen hemen her projede Makefile dır. Temel hali ile basit bir Makefile
aşağıdaki şekildedir.
Makefile dosyasının komutları iskelet olarak aşağıdaki şekilde komutları işler.
hedef: gereklilikler
[tab] komutlar
Bu örneğe göre bir basit derleme komutu aşağıdaki şekilde tanımlanabilir.
all: uygulama_adi
uygulama_adi: derleme_komutları
install:
M.Ali VARDAR 2006 Make Kullanımı nasıldır?
cp uygulama_adi /usr/bin;cp files /usr/share/uygulama_adi
clean:
rm rf
*
Makefile dosyalarında yapılan işlemler ile ilgili açıklama vermek amacıyla # işareti
kullanılır. Bu işaretten sonra gelen alan açıklam kabul edilir ve işletilmez.
# FreeBSD için kullanılacak değişkenler
LIBS=/usr/local/lib
biçiminde kullanılabilir.
Örnek Makefile içindeki all, install, clean alanlarının altındaki satırların bir sonraki
komuta kadar, tab ile boşluk verilmesi gerekmektedir. Tab yerine boşluk
kullanamazsınız. Kullanılması durumunda make işlemi hata vererek duracaktır. Tab
bazı editörlerde dört karakter boşluk bırakmaktadır. Bu durumda iki defa basılması
gerekecektir. Vi kullanıcıları bu sorunu yaşamayacaktır. Aynı zamanda uzun bir
satırın bölünmesi istenirse "\" karakteri verildikten sonra alt satırdan devam
edilebilir. Makefile yazılırken uygulama içinde gerekli değişklikleri yaptıktan sonra
konsolda make veya make all komutu derlemeyi başlatacaktır. install ve clean
tanımları en sık kullanılan tanımlardır. Bunların yerine kur veya kaldır isimleri veya
size kalmış başka adlar verilebileceği gibi farklı isimlerde ilave komutlar eklenebilir.
Makefile içinde tekrar eden değerler, değişken tanımlanarak kullanılabilir. Örnek
olarak sıklıkla kullanılan değişkenler olarak derleyici adı ve kütüphane yolları
verilebilir.
CC=gcc w
mcpu=
i686 O1
LIBS=L/
usr/lib/mysql I/
usr/include/mysql lmenu
lform
lmysqlclient
lcrypt
Tanımlanan değişkenler Makefile içinde $(degisken_adi) biçiminde kullanılabilir.
Örnek olarak tanımlanan değişkenler;
$(CC)
$(LIBS)
Daha önceden tanımlanmış olan ve kullanıma hazır olan değişkenler mevcuttur.
Bunları siz önceden tanımlamasanız dahi varsayılan değerleri ile kullanılabilir. Bu
değişkenler
CC C programlarını derlemek için tanımlanan derleyici varsayılan değer: cc
RM Programları silmek için kulanılacak program varsayılan değer: rm -f
$@ Kullanıldığı andaki hedefin adını belirtir. Kısaca çıktı dosyasının adıdır.
$< Kullanıldığı andaki girdi dosyasını belirtir.
Bu değişkenler tekrar tanımlanarak farklı bir değer ile kullanılabilir.
Bütün bu örneklerden sonra olabilecek basit haliyle kullanılan bir make dosyasını
inceleyelim ve bunu daha komplike hale getirmeye çalışalım. Konsolda editörümüz
ile aşağıdaki komutları Makefile adı ile kayıt edelim. Konsolda make komutuna
parametre verilmez ise make all komutunu çalıştıracaktır. Önemli olan : ile biten her
M.Ali VARDAR 2006 Make Kullanımı nasıldır?
yazı birer komut olarak make kullanılır. Bu komut ile birlikte : dan sonra gelen
komutlar işletilir.
#Kullanıma hazır Makefile dosyası
CC=gcc
all: uygulama_adi
uygulama_adi: uygulamam.c
$(CC) O3
w
Wall
I/
usr/include I/
usr/local/include\
o
uygulamam uygulamam.c
strip uygulamam
#Bu alanda bulunan o
uygulamam uygulamam.c kısmında bulunan
#“uygulamam” $@ kullanılarak uygulama_adi biçiminde de kullanılabilir.
#Bütün satır di er bir yolla bu ekilde ğ ş yazılabilirdi.
#$(CC) O3
w
Wall
I/
usr/include I/
usr/local/include $< o
$@
#make clean sonrası çalıştırılacak olan komut seti.
clean:
rm rf
uygulamam
rm rf
*.o
#make install sonrası çalıştırılacak olan komut seti
install:
mkdir /etc/uygulamam
cp ./uygulamam.conf /etc/uygulamam/uygulamam.conf
#aynı zamanda uygulamanın sistemden kaldırılması için yazılmış hazır
#komut seti
uninstall:
rm rf
/etc/uygulamam
rm rf
/usr/local/bin/uygulamam
Makefile içinde terkrar eden işlemlerin özellikle de dağıtımdan veya işletim
sisteminden farklı olması muhtemel olan alanların değişkenler içinde Makefile
dosyasının başında tanımlanması çok önemli bir noktadır. Yazılan uygulamanın
basit değişiklikler ile istenen dağıtımda veya farklı bir işletim sisteminde (örnek BSD
türevleri gibi) hatasız derlenmesini sağlayacaktır. Örnek olarak kurulmak istenen
dizin bu alanda belirlenebilir. Farklı bir derleyici kullanılabilir. En önemlisi ise
M.Ali VARDAR 2006 Make Kullanımı nasıldır?
gerekli kitaplıklara ait dizinler değişken olarak tanımlanabilir. Örnek olarak gerekli
kitaplık dizinlerini dosyanın başında LIB değişkeni içinde tanımlarsak;
LIBS=L/
usr/lib/mysql I/
usr/include/mysql lmenu
lform
lmysqlclient
lcrypt
Bu değişken
$(CC) O3
w
Wall
$(LIBS) o
uygulamam uygulamam.c
biçiminde kullanılabilir. Bu değişiklik bizlere birden fazla derleme anında hepsini
düzenleme derdinden kurtarır ve Makefile kullanımında işletim sisteminin şartlarına
göre esneklik kazandırır. Projeye başlarken olası değişiklikler göz önüne alınmalıdır.
Birden fazla işletim sistemi hedefleniyorsa mutlaka olası değişiklikler değişkenler
içinde tanımlanmalıdır.
Makefile dosyaları içine dışarıdan dosyalar dahil edilebilir. bu amaçla include
komutu kullanılır. Aynı uazntıya sahip birden fazla dosya *.uzanti biçiminde
tanımlanarak kullanılabilir. Aynı zamanda tek include parametresi ile birden fazla
farklı tip dosya Makefile içine eklenebilir. Örnek olarak;
include degiskenler.mk libler.mk base.mk
gibi kullanılabilir. bunun yanında include sırasında değişkenlerde kullanılabilir.
eklenti=libler.mk
include degiskenler.mk $(eklenti)
M.Ali VARDAR
ali@linuxprogramlama.com
Bu yazının son şeklini www.linuxprogramlama.com adresinden temin
edebilirsiniz.
Yasal Açıklama:
Bu belgenin, [GCC Kullanımı] 1.0 sürümünün telif hakkı © 2005 M. Ali Vardar'a aittir.
Bu belgeyi, Free Software Foundation tarafından yayınlanmış bulunan GNU Özgür
Belgeleme Lisansının 1.1 ya da daha sonraki sürümünün koşullarına bağlı kalarak
kopyalayabilir, dağıtabilir ve/veya değiştirebilirsiniz. Bu Lisansın bir kopyasını
http://www.gnu.org/copyleft/fdl.html adresinde bulabilirsiniz.
BU BELGE "ÜCRETSİZ" OLARAK RUHSATLANDIĞI İÇİN, İÇERDİĞİ BİLGİLER İÇİN
İLGİLİ KANUNLARIN İZİN VERDİĞİ ÖLÇÜDE HERHANGİ BİR GARANTİ
VERİLMEMEKTEDİR. AKSİ YAZILI OLARAK BELİRTİLMEDİĞİ MÜDDETÇE TELİF
HAKKI SAHİPLERİ VE/VEYA BAŞKA ŞAHISLAR BELGEYİ "OLDUĞU GİBİ", AŞİKAR
VEYA ZIMNEN, SATILABİLİRLİĞİ VEYA HERHANGİ BİR AMACA UYGUNLUĞU DA
DAHİL OLMAK ÜZERE HİÇBİR GARANTİ VERMEKSİZİN DAĞITMAKTADIRLAR.
BİLGİNİN KALİTESİ İLE İLGİLİ TÜM SORUNLAR SİZE AİTTİR. HERHANGİ BİR
HATALI BİLGİDEN DOLAYI DOĞABİLECEK OLAN BÜTÜN SERVİS, TAMİR VEYA
DÜZELTME MASRAFLARI SİZE AİTTİR. İLGİLİ KANUNUN İCBAR ETTİĞİ
DURUMLAR VEYA YAZILI ANLAŞMA HARİCİNDE HERHANGİ BİR ŞEKİLDE TELİF
M.Ali VARDAR 2006 Make Kullanımı nasıldır?
HAKKI SAHİBİ VEYA YUKARIDA İZİN VERİLDİĞİ ŞEKİLDE BELGEYİ DEĞİŞTİREN
VEYA YENİDEN DAĞITAN HERHANGİ BİR KİŞİ, BİLGİNİN KULLANIMI VEYA
KULLANILAMAMASI (VEYA VERİ KAYBI OLUŞMASI, VERİNİN YANLIŞ HALE
GELMESİ, SİZİN VEYA ÜÇÜNCÜ ŞAHISLARIN ZARARA UĞRAMASI VEYA
BİLGİLERİN BAŞKA BİLGİLERLE UYUMSUZ OLMASI) YÜZÜNDEN OLUŞAN
GENEL, ÖZEL, DOĞRUDAN YA DA DOLAYLI HERHANGİ BİR ZARARDAN, BÖYLE
BİR TAZMİNAT TALEBİ TELİF HAKKI SAHİBİ VEYA İLGİLİ KİŞİYE BİLDİRİLMİŞ
OLSA DAHİ, SORUMLU DEĞİLDİR.
Tüm telif hakları aksi özellikle belirtilmediği sürece sahibine aittir. Belge içinde geçen
herhangi bir terim, bir ticari isim ya da kuruma itibar kazandırma olarak
algılanmamalıdır. Bir ürün ya da markanın kullanılmış olması ona onay verildiği
anlamında görülmemelidir.
Logged

Metaponte
Global Moderator
***
Offline Offline

Cinsiyet: Bay
Mesaj Sayısı: 122



Üyelik Bilgileri
« Yanıtla #3 : Ocak 16, 2008, 11:56:04 ÖÖ »

Ltrace Nasıl?
Ltrace Kullanımı
Ltrace, uygulamaların kullandığı dinamik kitaplık çağrılarını izlememize
yarayan aracın adıdır. Kullanımı genel olarak strace 'e benzer. ltrace ve
strace isimli uygulamalar büyük ve sık kullanılan uygulamalar değildir.
Hata ayıklama işlemleri için, öğrenilmesi gerekli uygulamalar
arasındadır. Şimdi çıktısını görmek için basit bir uygulama yazalım ve
ne tür mesajlar verdiğini gözleyelim. Çıktılarını izleyeceğimiz uygulama
en basit hali ile aşağıdaki şekildedir.
#include <stdio.h>
int main()
{
int i;
printf("ornek uygulama\n");
for (i=0;i<3;i++) printf("%i\n",i);
}
Uygulamayı aşağıdaki şekilde derleyelim.
gcc o
ilk ilk.c
ltrace ile uygulamanın çağrılarını doğrudan ekranda gösteren en basit
kullanımı aşağıdaki şekildedir.
ltrace ./ilk
Konsolda uygulamanın ürettiği çıktı aşağıdaki şekildedir.
__libc_start_main(0x8048394, 1, 0xbfaf5ac4, 0x80483f0, 0x80483e0
<unfinished ...>
puts("ornek uygulama"ornek uygulama
)
= 15
printf("%i\n", 00
)
= 2
printf("%i\n", 11
)
= 2
printf("%i\n", 22
)
= 2
+++ exited (status 2) +++
M.Ali VARDAR 2006 Ltrace Nasıl?
libc içinden yapılan çağrıların listesini son derece net anlaşılır bir
şekilde ekranda çıktı olarak vermektedir. strace isimli uygulama da
olduğu gibi büyük ve hemen sonlanmayan uygulamalar için tüm çıktıyı
o
parametresi ile birlikte bir dosya içine aktarılabilir.
ltrace o
cikti.txt ./ilk
S
parametresi, sistem çağrılarını da normal kitaplık çağrıları ile
birlikte gösterir. L
parametresi ile birlikte kullanılırsa, sadece sistem
çağrıları izlenebilir. L
kitaplık çağrılarını göstermez. Bu parametre tek
başına uygulamayı işlevsiz hale getirir. S
parametresi kullanılması
mantıklıdır.
Sistem ve kitaplık çağrılarını birlikte gözlemek için;
ltrace S
o
cikti.txt ./ilk
Sadece sistem çağrıları için;
ltrace S
L
o
cikti.txt ./ilk
Eğer çalışan bir uygulama mevcut ise bu uygulamanın kitaplık
çağrılarını izlemek için p
parametresi kullanılır. p
parametresi ile
çalışan bir sürecin pid numarası ile onun çağrıları gözlem altına
alınabilir. Örnek olarak çalışan bir uygulamanın pid numarası 8763
olsun. Gözlemek için;
ltrace p
8763
Sonuç olarak ltrace her zaman lazım olmayan bir uygulama olsa da
neler yaptığını bilmek bizler için önemlidir. Özellikle yazılmış olan
uygulamaların bazı şeyleri nasıl yaptığını anlamak için hangi çağrıların
yaptığını anlamak için kullanılabilir.
M.Ali VARDAR
ali@linuxprogramlama.com
Bu yazının son şeklini www.linuxprogramlama.com adresinden temin
edebilirsiniz.
Yasal Açıklama:
Bu belgenin, [GCC Kullanımı] 1.0 sürümünün telif hakkı © 2006 M. Ali Vardar'a aittir. Bu
belgeyi, Free Software Foundation tarafından yayınlanmış bulunan GNU Özgür
Belgeleme Lisansının 1.1 ya da daha sonraki sürümünün koşullarına bağlı kalarak
kopyalayabilir, dağıtabilir ve/veya değiştirebilirsiniz. Bu Lisansın bir kopyasını
http://www.gnu.org/copyleft/fdl.html adresinde bulabilirsiniz.
M.Ali VARDAR 2006 Ltrace Nasıl?
BU BELGE "ÜCRETSİZ" OLARAK RUHSATLANDIĞI İÇİN, İÇERDİĞİ BİLGİLER İÇİN
İLGİLİ KANUNLARIN İZİN VERDİĞİ ÖLÇÜDE HERHANGİ BİR GARANTİ
VERİLMEMEKTEDİR. AKSİ YAZILI OLARAK BELİRTİLMEDİĞİ MÜDDETÇE TELİF
HAKKI SAHİPLERİ VE/VEYA BAŞKA ŞAHISLAR BELGEYİ "OLDUĞU GİBİ", AŞİKAR
VEYA ZIMNEN, SATILABİLİRLİĞİ VEYA HERHANGİ BİR AMACA UYGUNLUĞU DA
DAHİL OLMAK ÜZERE HİÇBİR GARANTİ VERMEKSİZİN DAĞITMAKTADIRLAR.
BİLGİNİN KALİTESİ İLE İLGİLİ TÜM SORUNLAR SİZE AİTTİR. HERHANGİ BİR
HATALI BİLGİDEN DOLAYI DOĞABİLECEK OLAN BÜTÜN SERVİS, TAMİR VEYA
DÜZELTME MASRAFLARI SİZE AİTTİR. İLGİLİ KANUNUN İCBAR ETTİĞİ
DURUMLAR VEYA YAZILI ANLAŞMA HARİCİNDE HERHANGİ BİR ŞEKİLDE TELİF
HAKKI SAHİBİ VEYA YUKARIDA İZİN VERİLDİĞİ ŞEKİLDE BELGEYİ DEĞİŞTİREN
VEYA YENİDEN DAĞITAN HERHANGİ BİR KİŞİ, BİLGİNİN KULLANIMI VEYA
KULLANILAMAMASI (VEYA VERİ KAYBI OLUŞMASI, VERİNİN YANLIŞ HALE
GELMESİ, SİZİN VEYA ÜÇÜNCÜ ŞAHISLARIN ZARARA UĞRAMASI VEYA
BİLGİLERİN BAŞKA BİLGİLERLE UYUMSUZ OLMASI) YÜZÜNDEN OLUŞAN
GENEL, ÖZEL, DOĞRUDAN YA DA DOLAYLI HERHANGİ BİR ZARARDAN, BÖYLE
BİR TAZMİNAT TALEBİ TELİF HAKKI SAHİBİ VEYA İLGİLİ KİŞİYE BİLDİRİLMİŞ
OLSA DAHİ, SORUMLU DEĞİLDİR.
Tüm telif hakları aksi özellikle belirtilmediği sürece sahibine aittir. Belge içinde geçen
herhangi bir terim, bir ticari isim ya da kuruma itibar kazandırma olarak
algılanmamalıdır. Bir ürün ya da markanın kullanılmış olması ona onay verildiği
anlamında görülmemelidir.
Logged

Sayfa: [1]   Yukarı git
  Yazdır  
 
Gitmek istediğiniz yer:  


[Basit Gorunum]

MySQL ile Güçlendirildi PHP ile Güçlendirildi Powered by SMF 1.1.6 | SMF © 2006, Simple Machines LLC

acikkaynak
XHTML 1.0 Geçerli! CSS Geçerli! Dilber MC Theme by HarzeM