Gcc Komutu Kullanımı...

MySouLNeedLove

New member
Katılım
9 Ara 2005
Mesajlar
825
Reaction score
0
Puanları
0
Yaş
37
Konum
Çalışıyorum
Çok sık gelen Linux ortamında veya bir Linux box ta exploit derleme ile ilgili sorulara çok ayrınıtı bir döküman.

Daha ayrıntılı olarak e-kitap: http://www.linuxprogramlama.com/documents/gcc.pdf


GCC her sürümü ile birlikte bir takım eklentiler olmaktadır.
GCC sürümünüzü öğrenmek için;
# gcc -v # komutunu kullanabilirsiniz.
Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/2.96/specs
gcc version 2.96 20000731 (Red Hat Linux 7.3 2.96-110)
Benim makinemede 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
ilk basit uygulamamızı yazalım ve ilk derleme işlemimize geçelim.

Kod:
#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ı favori editörümüz ile yazdıktan sonra
ilk.c olarak kayededelim ve aşağıdaki satırları yazalım.

Kod:
#gcc ilk.c

Bu satırdan sonra uygulama hata yok ise veyahutta uyarı bir mesaj vermeden

devam eder. Ancak 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.


Kod:
#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 derlenmelidir. ?
Bu aşamada örnek basit uygulamamız üzerinde bir iki ufak değişiklik yapalım;


Kod:

#include <ncurses.h>
int main()
{
initscr();
getch();
endwin();

printf("bittin");
}
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.


Kod:
# 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.

Kod:

# 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 dizininide eklemiş olduk.

Şu aşamadan itibaren ncurses kitaplıklarını uygulamamız içerisine
ekleyebiliyoruz ve istedişimiz ncurses
komudunu kullanabiliriz.
Bunun yanında mysql kitaplıklarını da sisteme katmak istersek uygulamamızı
aşağıdaki şekle sokalım;


Kod:
#include <ncurses.h>
#include <mysql.h>
int main()
{
initscr();
getch();
endwin();
printf("bittin");
}
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 bulamado halbuki -I/usr/include yazdok, peki sistemde ufak bir
arama yapalım bakalım doğrumu yazmışız.
# 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çerisinde bulunmaktaymış ö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
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çerisinde deneyelim;

Kod:
# 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.


Kod:

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
mani 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.

Kod:
# 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. Burada
dikkat edilecek olan husus uygulama içerisinde optimize komutları arttıkça
seg_fault verme ihtimali de yükselebilir zira uygulama içinde farklı kitaplıklar
kullanılması ve kitaplıkların global değişkenler ile kullanılması durumunda bir takım sorunlar oluşturulabilir.

Kaynak : LinuxProgramlama
 
Geri
Üst