Topik ini menyiapkan seluruh perkakas yang digunakan sepanjang jalur, yaitu assembler NASM, assembler GNU as, linker ld, debugger gdb, dan penelusur syscall strace. Pemasangan dilakukan melalui manajer paket apt, kemudian setiap perkakas diverifikasi melalui perintah versinya, dan bagian terakhir membuktikan bahwa alur rakit, taut, dan jalankan bekerja melalui satu program uji kecil. Versi yang tercetak pada setiap verifikasi menjadi acuan ketika keluaran contoh sepanjang jalur perlu disandingkan dengan hasil eksekusi di mesin lain.
Lima perkakas dalam alur build#
Program assembly tidak dijalankan langsung. Kode sumber terlebih dahulu dirakit oleh assembler menjadi berkas objek (object file), yaitu berkas biner berisi kode mesin yang alamatnya belum lengkap, kemudian digabungkan oleh linker menjadi executable yang siap dijalankan. Dua perkakas lain tidak membangun apa pun, melainkan mengamati program yang berjalan, yaitu debugger gdb dan penelusur syscall strace. Syscall sendiri adalah permintaan layanan dari program ke kernel Linux, misalnya menulis data atau mengakhiri proses. Rangkaian perkakas yang bekerja berurutan untuk menghasilkan sebuah program lazim disebut toolchain.
| Perkakas | Peran | Keluaran |
|---|---|---|
nasm | assembler untuk sintaks Intel | berkas objek ELF |
as | assembler untuk sintaks AT&T | berkas objek ELF |
ld | linker, menggabungkan berkas objek | executable statik |
gdb | debugger, menampilkan register dan memori | sesi interaktif |
strace | penelusur syscall program yang berjalan | log syscall |
nasm dan as mengerjakan pekerjaan yang sama, yaitu merakit kode sumber menjadi berkas objek, tetapi keduanya menerima sintaks yang berbeda. Sintaks Intel ditangani nasm, sedangkan sintaks AT&T ditangani as. Keduanya dipasang berdampingan karena materi dokumentasi, keluaran perkakas analisis, dan kode nyata di lapangan tersedia dalam kedua bentuk tersebut. Diagram berikut merangkum alur build beserta posisi dua perkakas pengamat.
Pemasangan dengan apt#
Pada Debian, Ubuntu, dan turunannya, seluruh perkakas terpasang melalui satu perintah apt. Perintah ini menulis ke direktori sistem sehingga membutuhkan hak sudo, dan pemasangannya juga bergantung pada koneksi ke repositori paket. Karena kedua syarat itu, perintah berikut tidak dieksekusi di sini dan cukup disalin ke terminal pada sistem yang akan digunakan untuk belajar.
# tidak-dijalankan
# pemasangan paket butuh hak sudo dan koneksi ke repositori
sudo apt install nasm build-essential gdb stracePaket build-essential membawa compiler gcc sekaligus binutils yang berisi as, ld, dan objdump. Paket nasm, gdb, dan strace membawa masing-masing assembler Intel, debugger, dan penelusur syscall. Pada distribusi lain seperti Fedora dan Arch, kelompok paket yang sama tersedia dengan nama serupa, yaitu binutils, gcc, gdb, nasm, dan strace. Perintah yang sama juga dapat dijalankan ulang kapan saja untuk memutakhirkan kelima paket ke versi yang lebih baru.
Pemeriksaan versi setiap perkakas#
Pemasangan belum dikatakan selesai sebelum tiap perkakas ditemukan dan versinya tercatat. Versi itu penting karena perilaku dan pesan tiap perkakas dapat bergeser antar versi. Setiap perkakas menyediakan perintah versinya sendiri, sehingga pemeriksaannya cukup lima perintah pendek berikut.
nasm -v
as --version | head -1
ld --version | head -1
gdb --version | head -1
strace --version | head -1NASM version 2.16.03
GNU assembler (GNU Binutils for Debian) 2.44
GNU ld (GNU Binutils for Debian) 2.44
GNU gdb (Debian 16.3-1) 16.3
strace -- version 6.13Lima baris keluaran mengonfirmasi lima perkakas, yaitu NASM 2.16.03, GNU as 2.44, GNU ld 2.44, gdb 16.3, dan strace 6.13. Apabila salah satu perintah berakhir dengan pesan command not found, paketnya belum terpasang atau direktori binernya belum masuk PATH. Kesalahan semacam ini sebaiknya diatasi sekarang karena seluruh jalur ini mengandaikan kelima perintah tersebut ditemukan.
Pemeriksaan itu juga memastikan kelengkapan perkakas pendamping binutils seperti objdump, readelf, dan nm, karena ketiganya terpasang bersama as dan ld. Perkakas pendamping tidak merakit apa pun, tetapi digunakan berulang kali sepanjang jalur untuk membaca isi berkas objek dan executable. Dengan memastikan semuanya ditemukan sejak sekarang, pencarian perkakas di tengah materi yang sedang dikerjakan dapat dihindari.
Uji coba alur rakit, taut, dan jalankan#
Versi yang benar belum menjamin alurnya bekerja, sehingga pemeriksaan ditutup dengan satu program uji kecil. Program berikut menulis satu baris teks ke terminal, kemudian mengakhiri dirinya dengan kode keluar 42. Dua syscall yang dipanggilnya adalah write untuk menulis dan exit untuk mengakhiri. Untuk bagian ini, yang sedang diuji adalah alur perkakasnya, bukan arti tiap barisnya.
default rel
section .data
pesan db "Halo, toolchain!", 10
panjang equ $ - pesan
section .text
global _start
_start:
mov rax, 1
mov rdi, 1
lea rsi, [pesan]
mov rdx, panjang
syscall
mov rax, 60
mov rdi, 42
syscall
section .note.GNU-stack noalloc noexec nowrite progbitsTiga perintah berikut merakit berkas tersebut, menautkannya, lalu menjalankannya.
nasm -f elf64 uji-halo.asm -o uji-halo.o # assembler: berkas objek
ld uji-halo.o -o uji-halo # linker: executable
./uji-halo # jalankan program
echo "exit=$?" # kode keluar dari programHalo, toolchain!
exit=42Tiga tahap alur berjalan dalam satu rangkaian. Opsi -f elf64 memilih format berkas objek ELF 64-bit yang menjadi format standar Linux x86-64, ld menggabungkan berkas objek itu menjadi executable uji-halo, dan shell menjalankannya. Direktif section .note.GNU-stack pada akhir berkas sumber menandai bahwa stack program tidak eksekutif sehingga linker menyelesaikan tautannya tanpa peringatan. Angka 42 pada keluaran berasal dari program itu sendiri, bukan dari shell, karena program mengakhiri dirinya dengan kode 42 melalui exit dan shell menyimpan nilai tersebut pada $?. Pola inilah yang digunakan berulang kali pada seluruh jalur, yaitu merakit, menautkan, menjalankan, lalu membaca kode keluarnya.
Ringkasan#
- Alur build assembly terdiri atas dua tahap, yaitu assembler menghasilkan berkas objek dan linker menggabungkannya menjadi executable.
nasmmenangani sintaks Intel,asmenangani sintaks AT&T,gdbmenginspeksi program saat berjalan, danstracemenelusuri syscall-nya.- Perintah versi tiap perkakas memverifikasi pemasangan sebelum perkakas tersebut digunakan.
- Program uji kecil membuktikan alur rakit, taut, dan jalankan bekerja, dengan kode keluar program terbaca melalui
$?.
Referensi#
- NASM 2.16.03 documentation — NASM Project — Manual assembler NASM yang dipakai untuk seluruh contoh sintaks Intel.
- GNU Binutils documentation — Sourceware
— Manual
asdanldyang menangani perakitan serta penautan. - gdb(1) — Linux man-pages — Ringkasan opsi debugger yang dipakai pada jalur ini.
- strace(1) — Linux man-pages — Opsi penelusuran syscall yang dipakai untuk mengamati program.