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.
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.
Jawaban:
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. ( -c
adalah opsi umum "cukup kompilasi; jangan tautkan".)
File Object adalah file yang dikompilasi itu sendiri. Tidak ada perbedaan diantara keduanya.
File yang dapat dieksekusi dibentuk dengan menghubungkan file Object.
File objek berisi instruksi tingkat rendah yang dapat dipahami oleh CPU. Itulah mengapa ini juga disebut kode mesin.
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.
Ada 3 jenis file objek.
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.c
file 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 -g
metadata penautan (serta debugging jika digunakan), dan tidak dapat dieksekusi secara langsung.
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.
Berisi kode mesin yang bisa langsung dimuat ke memori (oleh loader, misalnya execve ) dan kemudian dieksekusi.
Hasil menjalankan penaut di beberapa relocatable object files
adalah 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 resolution
dan relocation
.
Saat menautkan static library
ke fungsi yang direferensikan dalam objek input disalin ke eksekusi akhir. Dengan dynamic libraries
tabel 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 myexecutable
akan 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.
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.
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.