KOMPILASI DAN DISASSAMBLE PROGRAM
KOMPILASI DAN DISASSAMBLE PROGRAM
Suatu program komputer akan mudah dibaca dan dimengerti oleh manusia jika ditulis dalam bahasa manusia atau bahasa tingkat tinggi (high level language), seperti bahasa pemrograman C. Tetapi, agar program yang telah dibuat tersebut dapat dijalankan pada sistem komputer, maka setiap baris instruksi atau pernyataan pada bahasa program C harus diterjemahkan oleh suatu program lain agar berubah menjadi urutan instruksi yang sesuai dengan bahasa mesin tingkat rendah. Instruksi‐instruksi tersebut kemudian dikemas dalam suatu bentuk yang disebut executable object program dan disimpan dalam file biner. Langkah‐langkah menerjemahkan baris‐baris kode program pada C menjadi file eksekusi dilakukan dalam empat langkah meliputi pre‐processor, compiler, assembler, dan linker, yang seluruhnya disebut sistem kompilasi.
Misalkan kita menulis program C dalam dua file p1.c dan p2.c. Kemudian kita mengkompilasi kode program tersebut dengan mengetikkan command line :
$ gcc –O2 –o prog p1.c p2.c
Perintah gcc merupakan compiler default pada Linux yang menggunakan GNU C Compiler. Secara sederhana kita juga dapat menggunakan perintah cc. Flag –O2 memerintahkan compiler untuk melakukan optimasi tingkat‐2. Secara umum, jika tingkat optimasi meningkat maka program akan berjalan lebih cepat, tetapi hal ini beresiko meningkatkan waktu kompilasi dan meningkatkan kesulitan ketika melakukan debugging kode program. Optimasi tingkat‐2 merupakan kompromi yang baik antara kinerja optimasi dan kemudahan debugging. Flag –o memerintahkan compiler untuk memberi nama file eksekusi yang dihasilkan dengan nama prog. Perintah gcc tersebut menerjemahkan kode program menjadi file eksekusi dengan melalui empat langkah.
Pertama C pre‐processor akan memproses semua preprocessor directive, misalnya #define, atau memasukkan isi file‐ file yang tertulis #include directive ke kode program.
Kedua, compiler menghasilkan kode assembly untuk setiap file, menjadi p1.s dan p2.s. Selanjutnya, assembler mengkonversi kode assembly menjadi file kode objek biner p1.o dan p2.o.
Terakhir, linker menggabungkan kedua file kode objek dengan kode‐kode yang mengimplementasikan fungsi‐fungsi library Unix standar (mis. printf) dan menghasilkan file eksekusi.
Untuk hanya melakukan preprocessing, kita dapat menggunakan opsi “‐E” pada command line :
$ gcc –E p1.c
Untuk melihat kode assembly yang dihasilkan oleh compiler C, kita dapat menggunakan opsi “‐S” pada command line :
$ gcc –O2 –S p1.c
Perintah ini akan menyebabkan compiler hanya menghasilkan file assembly p1.s dan tidak melakukan langkah berikutnya. Kode assembly yang dihasilkan sesuai dengan format GAS (“Gnu Assembler”). Jika pada command line digunakan opsi “‐c”, maka GCC akan melakukan ‘compile’ dan ‘assemble’ kode program :
$ gcc –O2 –c p1.c
Perintah ini akan menghasilkan file kode object p1.o, dalam bentuk format biner dan tidak dapat dilihat secara langsung. Untuk memeriksa isi dari file kode objek, terdapat suatu program yang bernama disassembler. Program tersebut dapat melakukan konversi file kode objek menjadi format assembly. Pada sistem Unix/Linux, program OBJDUMP (singkatan dari “OBJECT DUMP”) dapat dipanggil menggunakan flag “‐d” :
$ objdump –d p1.o
Untuk menghasilkan kode yang dapat dieksekusi, kita harus menjalankan linker pada seluruh file kode objek. Program eksekusi akan dihasilkan dengan menggabungkan seluruh file kode objek pada command line :
$ gcc –O2 –o prog code.o main.c
File program eksekusi prog yang dihasilkan berisi tidak hanya kode yang kita masukkan, tetapi juga informasi yang digunakan untuk memulai dan mengakhiri program. Kita juga dapat melakukan dissasamble file prog :
$ objdump –d prog
Disassembler akan mengekstrak berbagai urutan kode yang terdapat pada file eksekusi prog.
Komentar
Posting Komentar