Apa itu file objek di C?

148

Saya membaca tentang perpustakaan di C tetapi saya belum menemukan penjelasan tentang apa itu file objek. Apa perbedaan nyata antara file terkompilasi lainnya dan file objek?
Saya akan senang jika seseorang bisa menjelaskan dalam bahasa manusia.

Pithikos
sumber
Versi yang lebih aktif dari ini: stackoverflow.com/questions/12122446/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Jawaban:

161

File objek adalah keluaran nyata dari fase kompilasi. Ini sebagian besar adalah kode mesin, tetapi memiliki info yang memungkinkan penaut untuk melihat simbol apa yang ada di dalamnya serta simbol yang diperlukannya untuk berfungsi. (Untuk referensi, "simbol" pada dasarnya adalah nama objek global, fungsi, dll.)

Sebuah linker mengambil semua file objek ini dan menggabungkannya untuk membentuk satu file yang dapat dieksekusi (dengan asumsi bahwa itu bisa, yaitu: tidak ada simbol duplikat atau simbol yang tidak ditentukan). Banyak kompiler akan melakukan ini untuk Anda (baca: mereka menjalankan linker sendiri) jika Anda tidak memberi tahu mereka untuk "hanya mengompilasi" menggunakan opsi baris perintah. ( -cadalah opsi umum "cukup kompilasi; jangan tautkan".)

cHao
sumber
Sebenarnya, dengan sebagian besar kompiler, keluaran dari fase kompilasi adalah kode assembly, dan kompiler kemudian memanggil assembler untuk mengubahnya menjadi file objek.
Chris Dodd
18
@ChrisDodd: Itu sering terjadi pada kompiler lama. Saat ini, kompiler tidak akan menghasilkan kode assembly kecuali Anda memintanya, dan sering kali tidak menggunakannya secara internal. Tapi bagaimanapun, perakitan akan menjadi sub-fase dari fase kompilasi, jadi semua itu bisa diperdebatkan.
cHao
2
dapatkah satu file objek dapat dieksekusi?
Madu
2
@ Madu: Umumnya, tidak. Bahkan jika file objek berada dalam format yang dirancang untuk dieksekusi (yang pada dasarnya tidak pernah ada), bagian tentang "simbol yang diperlukan agar dapat berfungsi" pada dasarnya mengakhiri kesepakatan. Bahkan "hello world" standar Anda memerlukan penautan ke pustaka runtime C.
cHao
77
  1. File Object adalah file yang dikompilasi itu sendiri. Tidak ada perbedaan diantara keduanya.

  2. File yang dapat dieksekusi dibentuk dengan menghubungkan file Object.

  3. File objek berisi instruksi tingkat rendah yang dapat dipahami oleh CPU. Itulah mengapa ini juga disebut kode mesin.

  4. Kode mesin tingkat rendah ini adalah representasi biner dari instruksi yang juga dapat Anda tulis secara langsung menggunakan bahasa assembly dan kemudian memproses kode bahasa assembly (direpresentasikan dalam bahasa Inggris) menjadi bahasa mesin (direpresentasikan dalam Hex) menggunakan assembler.

Berikut adalah aliran tingkat tinggi tipikal untuk proses ini untuk kode dalam Bahasa Tingkat Tinggi seperti C

-> melewati pra-prosesor

-> untuk memberikan kode yang dioptimalkan, masih dalam C

-> melewati compiler

-> untuk memberikan kode assembly

-> melewati assembler

-> untuk memberikan kode dalam bahasa mesin yang disimpan dalam OBJECT FILES

-> melewati Linker

-> untuk mendapatkan file yang dapat dieksekusi.

Alur ini dapat memiliki beberapa variasi misalnya sebagian besar kompiler dapat langsung menghasilkan kode bahasa mesin, tanpa melalui assembler. Demikian pula, mereka dapat melakukan pemrosesan awal untuk Anda. Tetap saja, bagus untuk memecah konstituen untuk pemahaman yang lebih baik.

RHT
sumber
5
Kode yang dioptimalkan tidak dibuat pada tahap pra-prosesor atau segera setelahnya. Pra-prosesor hanya berurusan dengan bahasanya sendiri dan hanya itu. Optimasi terjadi pada tahap kompilasi dan perakitan.
Ignas2526
Apakah file objek yang kita dapatkan setelah kompilasi sama dengan file yang dapat dieksekusi dalam bahasa mesin. Saya bingung karena, Anda mengatakan file objek dibuat pada langkah kedua dari langkah terakhir dan terakhir adalah file yang dapat dieksekusi. Jadi, file .0 yang kita dapatkan setelah kompilasi, apakah itu file yang dapat dieksekusi?
AV94
tidak bisakah satu file objek juga dapat dieksekusi?
Madu
34

Ada 3 jenis file objek.

File objek yang dapat direlokasi

Berisi kode mesin dalam bentuk yang dapat digabungkan dengan file objek yang dapat direlokasi lainnya pada waktu tautan, untuk membentuk file objek yang dapat dieksekusi.

Jika Anda memiliki a.cfile sumber, untuk membuat file objeknya dengan GCC, Anda harus menjalankan: gcc a.c -c

Proses lengkapnya adalah: preprocessor (cpp) akan berjalan di atas ac Outputnya (sumber tetap) akan dimasukkan ke dalam compiler (cc1). Outputnya (perakitan) akan dimasukkan ke assembler (sebagai), yang akan menghasilkan file relocatable object file. File tersebut berisi kode objek dan -gmetadata penautan (serta debugging jika digunakan), dan tidak dapat dieksekusi secara langsung.

File objek bersama

Jenis khusus dari file objek yang dapat direlokasi yang dapat dimuat secara dinamis, baik pada waktu buka, atau pada waktu proses. Perpustakaan bersama adalah contoh dari jenis objek ini.

File objek yang dapat dieksekusi

Berisi kode mesin yang bisa langsung dimuat ke memori (oleh loader, misalnya execve ) dan kemudian dieksekusi.

Hasil menjalankan penaut di beberapa relocatable object filesadalah executable object file. Linker menggabungkan semua file objek input dari baris perintah, dari kiri ke kanan, dengan menggabungkan semua bagian input berjenis sama (misalnya .data) ke bagian output berjenis sama. Ini menggunakan symbol resolutiondan relocation.

Bonus membaca:

Saat menautkan static libraryke fungsi yang direferensikan dalam objek input disalin ke eksekusi akhir. Dengan dynamic librariestabel simbol dibuat sebagai gantinya yang akan memungkinkan tautan dinamis dengan fungsi perpustakaan / global. Jadi, hasilnya adalah file objek yang dapat dieksekusi sebagian, karena bergantung pada pustaka. Jika pustaka tidak ada, file tidak lagi dapat dijalankan).

Proses penautan dapat dilakukan sebagai berikut: ld a.o -o myexecutable

Perintah: gcc a.c -o myexecutableakan memanggil semua perintah yang disebutkan di poin 1 dan di poin 3 (cpp -> cc1 -> as -> ld 1 )

1: sebenarnya adalah collect2, yang merupakan pembungkus di atas ld.

Paschalis
sumber
11

File objek adalah apa yang Anda dapatkan ketika Anda mengkompilasi satu (atau beberapa) file sumber.

Ini bisa berupa file yang dapat dieksekusi atau pustaka yang sepenuhnya selesai, atau file perantara.

File objek biasanya berisi kode native, informasi linker, simbol debugging, dan sebagainya.

Tikar
sumber
2

File objek adalah kode yang bergantung pada fungsi, simbol, dan teks untuk menjalankan program. Sama seperti mesin teleks lama, yang membutuhkan teletyping untuk mengirim sinyal ke mesin telex lainnya.

Dengan cara yang sama prosesor memerlukan kode biner untuk dijalankan, file objek seperti kode biner tetapi tidak ditautkan. Penautan membuat file tambahan sehingga pengguna tidak harus mengkompilasi sendiri bahasa C. Pengguna dapat langsung membuka file exe setelah file objek ditautkan dengan beberapa kompiler seperti bahasa c, atau vb dll.

Farhan
sumber