Primer cambio _printf
a printf
y el _start
símbolo a main
, luego usa gcc
para vincular el archivo objeto, que lo vinculará automáticamente a libc
, tienes que hacer eso porque AFAIK no puedes enlazar a libc sin un main
. También debe usar elf32 no elf64 al ensamblar porque el código tiene instrucciones de 32 bits:
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
Y construye con:
nasm -f elf32 vaja4.asm
gcc -m32 vaja4.o -o vaja4
$./test
$Hello world!!
Editar:
Dado que ahora está compilando código de 32 bits en un sistema de 64 bits, deberá instalar la versión de 32 bits de las bibliotecas
apt-get install ia32-libs
En Ubuntu 12.10, primero debe instalar los paquetes de desarrollo
sudo apt-get update
sudo apt-get install libc6-dev-i386
para
gcc -m32 vaja4.o -o vaja4
para trabajar.
Dudo que el error que ves se deba a un problema de 32/64 bits. El error que ves es decir
vaja4.asm:(.text+0x7): undefined reference to `_printf'
le dice claramente que el símbolo _printf no está definido, lo que significa que la biblioteca para la función printf no está vinculada.
su paso de vinculación, es decir
ld vaja4.o -o vaja4
no incluye bibliotecas. Debe vincular su programa con una biblioteca que pueda proporcionar la definición de la función printf. Creo que debería elegir la biblioteca por sí mismo sin molestarlo con estos mensajes, pero debido a que no puede encontrar una biblioteca C adecuada para esta función, supongo que no tiene las bibliotecas requeridas, es decir, falta una biblioteca de 32 o 64 bits. /P>
De todos modos, intente la siguiente secuencia de comandos para ensamblar y vincular su programa:
nasm -f elf vaja4.asm
ld -m elf_i386 vaja4.o vaja4
./vaja4