C'deki nesne dosyası nedir?


140

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:


153

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). ( -cyaygın bir "sadece derleme; bağlantı verme" seçeneğidir.)


Aslında, çoğu derleyicide, derleme aşamasındaki çıktı derleme kodudur ve derleyici derleyiciyi bunu bir nesne dosyasına dönüştürmesi için çağırır.
Chris Dodd

15
@ChrisDodd: Eski derleyicilerde genellikle durum böyleydi. Bu günlerde, derleyici siz istemedikçe derleme kodu oluşturmaz ve genellikle dahili olarak kullanmaz. Ancak her iki durumda da, derleme aşamasının bir alt aşaması olacaktır, bu yüzden bütün bunlar tartışmalıdır.
cHao

2
tek bir nesne dosyası yürütülebilir olabilir?
Bal

1
@Honey: Genellikle hayır. Nesne dosyası, yürütme için tasarlanmış bir formatta olsa bile (temelde asla öyle değildir), "çalışmak için ihtiyaç duyduğu semboller" hakkındaki o bölüm, anlaşmayı öldürür. Standart "merhaba dünyanız" bile bir C çalışma zamanı kütüphanesine bağlanmayı gerektirir.
cHao

74
  1. Bir Nesne dosyası derlenmiş dosyanın kendisidir. İkisi arasında fark yok.

  2. Yürütülebilir bir dosya, Nesne dosyaları bağlanarak oluşturulur.

  3. Nesne dosyası, CPU tarafından anlaşılabilecek düşük düzeyli talimatlar içerir. Bu yüzden makine kodu da denir.

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


5
Optimize edilmiş kod işlemci öncesi aşamada veya hemen sonrasında üretilmez. Ön işlemci yalnızca kendi dili ile ilgilenir ve hepsi bu kadar. Optimizasyon derleme ve montaj aşamalarında gerçekleşir.
Ignas2526

Derledikten sonra elde ettiğimiz nesne dosyası, makine dilinde yürütülebilir dosya ile aynıdır. Kafan karıştı, çünkü nesne dosyasının son adımdan ikinci adımda oluşturulduğunu ve son adımın yürütülebilir dosya olduğunu söylediniz. Yani, derlemeden sonra aldığımız .0 dosyası, yürütülebilir dosya mı?
AV94

tek bir nesne dosyası da çalıştırılamaz mı?
Bal

33

3 çeşit nesne dosyası vardır.

Taşınabilir nesne dosyaları

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.ckaynak 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 -gkullanılmışsa hata ayıklama ) meta verilerini içerir ve doğrudan yürütülebilir değildir.

Paylaşılan nesne dosyaları

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.

Yürütülebilir nesne dosyaları

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 filesbir 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 resolutionve relocation.

Bonus okuma:

Bir static librarynesneye bağlanırken, giriş nesnelerinde başvurulan işlevler son yürütülebilir dosyaya kopyalanır. Bunun dynamic librariesyerine 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 myexecutable1. 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.


11

Nesne dosyası, bir (veya birkaç) kaynak dosyayı derlediğinizde elde ettiğiniz şeydir.

Tamamen tamamlanmış bir yürütülebilir dosya veya kitaplık veya ara dosyalar olabilir.

Nesne dosyaları tipik olarak yerel kod, bağlayıcı bilgileri, hata ayıklama sembolleri vb. İçerir.


2

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.