První změna _printf
do printf
a _start
symbol na main
a poté použijte gcc
propojit objektový soubor, který jej automaticky propojí s libc
, musíte to udělat, protože AFAIK nemůžete propojit s knihovnou libc bez main
. Také byste měli při sestavování používat elf32 ne elf64, protože kód má 32bitové instrukce:
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
A stavět pomocí:
nasm -f elf32 vaja4.asm
gcc -m32 vaja4.o -o vaja4
$./test
$Hello world!!
Upravit:
Protože nyní kompilujete 32bitový kód na 64bitovém systému, budete muset nainstalovat 32bitovou verzi knihoven
apt-get install ia32-libs
Na Ubuntu 12.10 musíte nejprve nainstalovat vývojové balíčky
sudo apt-get update
sudo apt-get install libc6-dev-i386
pro
gcc -m32 vaja4.o -o vaja4
do práce.
Pochybuji, že chyba, kterou vidíte, je způsobena 32/64bitovým problémem. Chyba, kterou vidíte, tj.
vaja4.asm:(.text+0x7): undefined reference to `_printf'
vám jasně říká, že symbol _printf není definován, což znamená, že knihovna pro funkci printf není propojena.
váš krok propojení, tj.
ld vaja4.o -o vaja4
nezahrnuje žádné knihovny. Musíte propojit svůj program s knihovnou, která může poskytnout definici funkce printf. Věřím, že by si měl knihovnu vybrat sám, aniž by vás obtěžoval těmito zprávami, ale protože není schopen najít vhodnou knihovnu C pro tuto funkci, domnívám se, že požadované knihovny nemáte, tj. chybí buď 32bitová nebo 64bitová knihovna.
Každopádně vyzkoušejte prosím následující sekvenci příkazů pro sestavení a propojení vašeho programu:
nasm -f elf vaja4.asm
ld -m elf_i386 vaja4.o vaja4
./vaja4