C kütüphaneleri hakkında okuyorum ama henüz bir nesne dosyasının ne olduğu hakkında bir açıklama bulamadım. Herhangi bir derlenmiş dosya ile bir nesne dosyası arasındaki gerçek fark nedir?
Birisi insan dilinde açıklayabilirse sevinirim.
C kütüphaneleri hakkında okuyorum ama henüz bir nesne dosyasının ne olduğu hakkında bir açıklama bulamadım. Herhangi bir derlenmiş dosya ile bir nesne dosyası arasındaki gerçek fark nedir?
Birisi insan dilinde açıklayabilirse sevinirim.
Yanıtlar:
Bir nesne dosyası derleme aşamasından gelen gerçek çıktıdır. Çoğunlukla makine kodudur, ancak bir bağlayıcının içinde hangi sembollerin olduğunu ve çalışmak için ihtiyaç duyduğu sembolleri görmesini sağlayan bilgiye sahiptir. (Referans olarak, "semboller" temel olarak global nesnelerin, fonksiyonların vb. Adlarıdır.)
Bir bağlayıcı tüm bu nesne dosyalarını alır ve bunları tek bir yürütülebilir dosya oluşturacak şekilde birleştirir (olabileceğini varsayarak, yani: yinelenen veya tanımlanmamış semboller olmadığını). Komut satırı seçeneklerini kullanarak "sadece derlemelerini" söylemezseniz, birçok derleyici bunu sizin için yapar (oku: bağlayıcıyı kendi başlarına çalıştırırlar). ( -c
yaygın bir "sadece derleme; bağlantı verme" seçeneğidir.)
Bir Nesne dosyası derlenmiş dosyanın kendisidir. İkisi arasında fark yok.
Yürütülebilir bir dosya, Nesne dosyaları bağlanarak oluşturulur.
Nesne dosyası, CPU tarafından anlaşılabilecek düşük düzeyli talimatlar içerir. Bu yüzden makine kodu da denir.
Bu düşük seviyeli makine kodu, montaj dilini kullanarak doğrudan yazabileceğiniz ve ardından bir montajcı kullanarak montaj dili kodunu (İngilizce olarak temsil edilir) makine diline (Hex'de temsil edilir) işleyebileceğiniz talimatların ikili temsilidir.
İşte C gibi Yüksek Seviye Dilindeki kod için bu işlem için tipik bir yüksek seviye akışı
-> ön işlemciden geçer
-> optimize edilmiş kod vermek için, hala C
-> derleyiciden geçer
-> montaj kodu vermek
-> bir montajcıdan geçer
-> NESNE DOSYALARINDA saklanan makine dilinde kod vermek
-> Bağlayıcı üzerinden geçer
-> yürütülebilir bir dosya almak için.
Bu akış bazı varyasyonlara sahip olabilir, örneğin çoğu derleyici bir montajcıdan geçmeden doğrudan makine dil kodunu üretebilir. Benzer şekilde, sizin için ön işleme yapabilirler. Yine de, daha iyi bir anlayış için bileşenleri ayırmak güzel.
3 çeşit nesne dosyası vardır.
Yürütülebilir bir nesne dosyası oluşturmak için, makine kodunu bağlantı sırasında diğer taşınabilir nesnelerle birleştirilebilen bir formda içerir.
Bir a.c
kaynak dosyanız varsa, GCC ile nesne dosyasını oluşturmak için şunu çalıştırmalısınız:
gcc a.c -c
Tam işlem şöyle olacaktır: önişlemci (cpp) ac üzerinden çalışacaktır. Çıktısı (hala kaynak) derleyiciye (cc1) beslenir. Çıkışı (montaj), üretecek olan montajcıya (as) beslenir relocatable object file
. Bu dosya, nesne kodu ve bağlama (ve -g
kullanılmışsa hata ayıklama ) meta verilerini içerir ve doğrudan yürütülebilir değildir.
Yükleme sırasında veya çalışma zamanında dinamik olarak yüklenebilen özel yeniden yüklenebilir nesne dosyası türü. Paylaşılan kütüphaneler bu tür nesnelerin bir örneğidir.
Doğrudan belleğe yüklenebilen (yükleyici tarafından, örneğin yürütme ) ve daha sonra çalıştırılabilen makine kodunu içerir .
Bağlayıcıyı birden fazla çalıştırmanın sonucu relocatable object files
bir executable object file
. Bağlayıcı, tüm girdi nesnesi dosyalarını komut satırında, soldan sağa doğru, tüm aynı türde girdi bölümlerini (örneğin .data
) aynı türde çıktı bölümüne birleştirerek birleştirir . O kullanır symbol resolution
ve relocation
.
Bir static library
nesneye bağlanırken, giriş nesnelerinde başvurulan işlevler son yürütülebilir dosyaya kopyalanır. Bunun dynamic libraries
yerine kütüphane fonksiyonları / globalleri ile dinamik bir bağlantı sağlayacak bir sembol tablosu oluşturulur. Bu nedenle sonuç, kütüphaneye bağlı olduğu için kısmen yürütülebilir bir nesne dosyasıdır. Kitaplık yoksa, dosya artık yürütülemez).
Bağlama işlemi aşağıdaki gibi yapılabilir:
ld a.o -o myexecutable
Komut: gcc a.c -o myexecutable
1. ve 3. noktalarda belirtilen tüm komutları çağırır (cpp -> cc1 -> as -> ld 1 )
1: aslında ld üzerinde bir sarıcı olan collect2.
Nesne dosyaları, programı çalıştırmak için işlevlere, simgelere ve metne bağlı kodlardır. Tıpkı diğer teleks makinelerine sinyal göndermek için teletleme gerektiren eski teleks makineleri gibi.
İşlemcilerin çalışması için ikili kod gerektirdiği gibi, nesne dosyaları da ikili kod gibidir ancak bağlı değildir. Bağlama, kullanıcının C dilini derlemesine gerek kalmaması için ek dosyalar oluşturur. Nesne dosyası c dili veya vb. Gibi bir derleyiciye bağlandıktan sonra kullanıcılar doğrudan exe dosyasını açabilir.