Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

GCC derleme aşamaları ?

Başlatan muhittin_kaplan, 24 Ocak 2017, 13:31:45

muhittin_kaplan

GCC derleme aşamaları nelerdir ?
main.c ye

stm32 için yazdığım bir bilink programı hangi aşamalardan geçer ve çalıştırılabilir kod olur?

vitruvius

#1

  • Preprocessing (-E: Preprocessing'den sonra dur ve compile yapma.)
  • Compiling (-S: Compilation'dan sonra dur ve assemble yapma.)
  • Assembling (-c: Compile yada assemble yap ama link yapma.)
  • Linking (Herhangi switch vermezseniz link işlemi gerçekleşir.)

Bayrakların detayları için buradan 2.2 Options Controlling the Kind of Output'a bakılabilinir.

Ayrıca derleme adımlarına -v bayrağı ile ulaşabilirsiniz. Misal:

#gcc HelloWorld.c -o HelloWorld -v

muhittin_kaplan

Alıntı YapPreprocessing (-E: Preprocessing'den sonra dur ve compile yapma.)
Compiling (-S: Compilation'dan sonra dur ve assemble yapma.)
Assembling (-c: Compile yada assemble yap ama link yapma.)
Linking (Herhangi switch vermezseniz link işlemi gerçekleşir.)
Hocam Nedir bunlar neler yapar ?

ISS

abi surada bir kitaptan aldigim notlar var. faydali olabilir. daha fazla bilgi gcc nin kendi sayfalarinda var.

https://drive.google.com/file/d/0B-EPk2O8cfbrenh1Q0FQTWstQW8/view?usp=drivesdk

Sya

Hocam linux da terminal üzerinden mi derlemeye çalışıyorsunuz ?

muhittin_kaplan

#5
Yok Hocam (STM32 için gcc+eclipse kullanıyorum), genelde  ne yapıyoruz. IDE üzerinde tekerleğe,dişliye, noktasal butona basıp işi bitiriyoruz.
linker nedir, object file nedir, s file nedir?
Sorumdaki esas amaç bunları ortaya çıkartmak.

vitruvius

#6
Örnek programımız aşağıdaki kod parçası olsun. Dosya ismi "HelloWorld.c".

#include <stdio.h>

// Let's get started.
int main()
{
  printf("Hello World!\n");
  return 0;
}


Preprocessing
Bu aşamada # ile eklediğimiz header dosyaları v.s. programınıza göre tercüme edilir ve gerekli kodlar oluşur. Ayrıca yorumlar da bu aşamada silinir.

Aşağıdaki gibi derlersek bu aşama sonunda ne üretildiğini görürüz.

#gcc -E HelloWorld.c -o HelloWorld


Oluşan dosyaya bakarsak çok sayıda typedef ve extern üretildiğini görürüz. En sonunda ise;

extern int ftrylockfile (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__)) ;


extern void funlockfile (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__));
# 943 "/usr/include/stdio.h" 3 4

# 2 "HelloWorld.c" 2


int main()
{
  printf("Hello World!\n");
  return 0;
}


görülecektir. Buradan da görüyoruz ki Preprocessing stdio.h ile gerekli tercüme işini yapmış, yorumları silmiş ve programın geri kalanına dokunmamıştır.

Compiling
Burada bir önceki aşamada üretilen preprocessed koddan hedef mimariye göre assembly kod üretilir.

Aşağıdaki şekilde derlersek bu aşamanın sonucunda üretilen kodu da görebiliriz:
#gcc -S HelloWorld.c -o HelloWorld


Üretilen dosyanın içine bakarsak Assembly instructions'ı görebiliriz.

        .file   "HelloWorld.c"
        .section        .rodata
.LC0:
        .string "Hello World!"
        .text
        .globl  main
        .type   main, [member=42707]function[/member]
main:
.LFB0:
        .cfi_startproc
        pushq   %rbp
        .cfi_def_cfa_offset 16
        .cfi_offset 6, -16
        movq    %rsp, %rbp
        .cfi_def_cfa_register 6
        movl    $.LC0, %edi
        call    puts
        movl    $0, %eax
        popq    %rbp
        .cfi_def_cfa 7, 8
        ret
        .cfi_endproc
.LFE0:
        .size   main, .-main
        .ident  "GCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-4)"
        .section        .note.GNU-stack,"",@progbits
~                                                       


Assembling
Bu aşamada bir önceki adımda üretilen Assembly kod makine kodu yada object koda dönüştürülür. Kodda gerekli yerlerde referans oluştururlur (printf'te mesela).

Kodumuzu aşağıdaki gibi derlersek bu aşamanın sonucunda üretilen dosyayı görebiliriz.

#gcc -c HelloWorld.c -o HelloWorld


Ancak bu aşamada oluşan kod makine kodu olduğundan okunamayacak durumdadır. Eğer ki hexdump ile açılırsa HEX kod görülebilinir.

Linking
Bu aşamada da bir önceki aşamada üretilen object dosyasındaki referanslarla std kütüphaneler yada dışardan eklediğiniz kütüphaneler arasındaki bağlantı kurulur. Bu aşamadan sonra çalıştırabileceğiniz .out dosyası da oluşturulur.

Bunun için de aşağıdaki kodu çalıştırmak gerekir.
#gcc HelloWorld.c -o HelloWorld


Bu aşamadan sonra üretilen HelloWorld'u çalıştırırsak ekranda "Hello World" yazacaktır.

Teğmen

Biraz daha açarak anlatır mısınız konuyu
"Girdim ilim meclisine kıldım eyledim talep,   Dediler ilim geride kaldı illa Edep illa Edep" Hz.Yunus Emre K.S.

vitruvius

Alıntı yapılan: Teğmen - 24 Ocak 2017, 16:20:58
Biraz daha açarak anlatır mısınız konuyu

Daha ne kadar açayım? :( Neresi anlaşılmadı? Akşam biraz daha detaylandırabilirim vaktim olursa.

Teğmen

Elinize sağğlık baya faydalı olmuş ama yeni olunca biraz zor anlaşılıyor.
Teşekkür ederiz
"Girdim ilim meclisine kıldım eyledim talep,   Dediler ilim geride kaldı illa Edep illa Edep" Hz.Yunus Emre K.S.

vitruvius

Yok anlaşılmayan yerleri söyleyin ki detaylandırayım ki daha da faydalı olsun. Ama verdiğim sırada derleyip oluşan dosyalara bakarsanız biraz daha net anlaşılır.

Teğmen

Anladım deneyim bir takıldığım yerleri sorarım
"Girdim ilim meclisine kıldım eyledim talep,   Dediler ilim geride kaldı illa Edep illa Edep" Hz.Yunus Emre K.S.