B.1.1 GCC Derleme Aşamaları
Birçok yazılım dilinde olduğu gibi, C dilinde yazılmış bir kaynak kodun derlenip yürütülebilir bir koda dönüşmesi için çeşitli aşamalardan geçmesi gerekmektedir. Bu aşamalar aşağıda özetlenmiştir:
Kaynak kod dosyaları: .c
, .h
↓
ÖNİŞLEME
↓
Önişlemci çıktı dosyaları: .i
↓
DERLEME
↓
Birleştirici dil dosyaları: .s
↓
BİRLEŞTİRME
↓
Amaç kod dosyaları: .o
↓
BAĞLAMA
↓
Yürütülebilir kod dosyaları: Örn. a.out
Önceki kısımda da gördüğümüz gibi, basitçe
$ gcc prog.c
komutu yazıldığında, tüm bu aşamalar sessiz bir şekilde
geçilir ve eğer herhangi bir aşamada hata alınmazsa, a.out
yürütülebilir kod dosyası oluşur. Böyle bir durumda, yukarıda bahsi geçen
ara dosyalar (.i
, .s
ve .o
)
saklanmaz, komutun normal veya hatalı bittiğine bakılmaksızın
bunlar otomatik olarak silinir. Bu aşamaların bazılarını atlamak için de
kullanılabilecek bazı GCC komut örnekleri aşağıda verilmiştir.
gcc -E -o prog.i prog.c | Sadece önişleme yapılır, diğer aşamalar atlanır. Oluşan
önişleme çıktı dosyası prog.i ’dir. Ek olarak
-C seçeneği kullanıldığında, kaynak dosyaların
içindeki açıklamalar silinmez. |
gcc -S -fverbose-asm prog.c | Derleme esnasında oluşan birleştirici dili kaynak kodu
prog.s isimli dosyaya konulur ve derleme işlemi
durdurulur. -fverbose-asm seçeneği C kaynak kodundaki
değişken isimlerinin, oluşturulan birleştirici dili dosyasında
açıklama olarak saklanmasına olanak tanır. |
gcc -c prog.c | Önişleme, derleme ve birleştirme yapılır, ancak bağlama işlemi yapılmaz.
Oluşan amaç kod prog.o dosyasında saklanır. |
gcc -g -c -Wa,-a=prog.list,-L prog.c | Burada, -Wa, seçeneği ile doğrudan birleştiriciyi ilgilendiren
seçenekler (örneğin -a=prog.list ve -L )
birleştiriciye geçirilir.
Bu seçeneklerin başında ve aralarında virgül olmalıdır. Bu örnekte,
birleştiricinin detaylı bir çıktı dosyası (prog.list )
oluşturması ve bu dosyaya kaynak kodundan gelen satırları da
eklemesi istenmektedir. |
gcc prog.c -lm | Eğer kaynak dosyada kullanılan bazı fonksiyonlar standart kütüphanede
(libc.a ) değil de, buradaki örnekte olduğu gibi,
başka bir kütüphanede (libm.a ) ise, komutun sonuna
kütüphane dosya isminin başındaki lib ve sonundaki
.a atılarak, kalan kısım (m ) -l
seçeneği ile arkasına boşluk bırakılmadan verilir. Eğer kütüphanenin bulunduğu
dizin (/usr/lib gibi) standart bir dizin değilse,
-l seçeneğinden önce -L ile arkasına
boşluk bırakılmadan dizinin tam adı verilebilir. |
gcc -Wl,-Map,prog.map prog.c | Burada, -Wl, seçeneği ile doğrudan bağlayıcıyı ilgilendiren
seçenekler (örneğin -Map ve prog.map )
bağlayıcıya geçirilir.
Bu seçeneklerin başında ve aralarında virgül olmalıdır. Bu örnekte,
bağlayıcının bir bağlama programcığı ve oluşturulan çalıştırılabilir dosyanın
bellek haritasının dökümünü oluşturup prog.map dosyasına
koyması istenmektedir. |
gcc -save-temps prog.c | Derleme ve bağlamanın tüm aşamaları gerçekleştirilir ve yukarıda
bahsi geçen prog.i , prog.s ve prog.o
dosyaları da oluşturulur. |
gcc -fsyntax-only prog.c | Derleme ve bağlamanın hiçbir aşaması gerçekleştirilmez; sadece kaynak programın sözdizimsel olarak doğru olup olmadığı kontrol edilir. |