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.
c
compilation
linker
object-files
Pithikos
sumber
sumber
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".)sumber
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.
sumber
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.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.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 files
adalahexecutable 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 menggunakansymbol resolution
danrelocation
.Bonus membaca:
Saat menautkan
static library
ke fungsi yang direferensikan dalam objek input disalin ke eksekusi akhir. Dengandynamic 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.
sumber
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.
sumber
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.
sumber