Ubah dulu _printf
ke printf
dan _start
simbol ke main
, lalu gunakan gcc
untuk menautkan file objek, yang secara otomatis akan menautkannya ke libc
, Anda perlu melakukannya karena AFAIK Anda tidak dapat menautkan ke libc tanpa main
. Anda juga harus menggunakan elf32 bukan elf64 saat merakit karena kode tersebut memiliki instruksi 32 bit :
bits 32
extern printf
global main
section .data
message db "Hello world!!", 10, 0
section .text
main:
pushad
push dword message
call printf
add esp, 4
popad
ret
Dan bangun dengan:
nasm -f elf32 vaja4.asm
gcc -m32 vaja4.o -o vaja4
$./test
$Hello world!!
Edit:
Karena sekarang Anda mengompilasi kode 32-bit pada sistem 64-bit, Anda perlu menginstal versi 32-bit dari pustaka
apt-get install ia32-libs
Di Ubuntu 12.10, Anda perlu menginstal paket pengembangan terlebih dahulu
sudo apt-get update
sudo apt-get install libc6-dev-i386
untuk
gcc -m32 vaja4.o -o vaja4
untuk bekerja.
Saya ragu kesalahan yang Anda lihat adalah karena masalah 32/64 bit. Kesalahan yang Anda lihat yaitu
vaja4.asm:(.text+0x7): undefined reference to `_printf'
dengan jelas memberi tahu Anda bahwa simbol _printf tidak terdefinisi yang berarti pustaka untuk fungsi printf tidak ditautkan.
langkah penautan Anda yaitu
ld vaja4.o -o vaja4
tidak termasuk perpustakaan apa pun. Anda perlu menautkan program Anda dengan perpustakaan yang dapat memberikan definisi fungsi printf. Saya percaya ld harus memilih perpustakaan itu sendiri tanpa mengganggu Anda dengan pesan-pesan ini tetapi karena tidak dapat menemukan perpustakaan C yang cocok untuk fungsi ini, saya rasa Anda tidak memiliki perpustakaan yang diperlukan yaitu perpustakaan 32 bit atau 64 tidak ada.
Pokoknya, silakan coba urutan perintah berikut untuk merakit dan menautkan program Anda:
nasm -f elf vaja4.asm
ld -m elf_i386 vaja4.o vaja4
./vaja4