Première modification _printf
à printf
et le _start
symbole en main
, puis utilisez gcc
pour lier le fichier objet, qui le liera automatiquement à libc
, vous devez le faire car AFAIK vous ne pouvez pas créer de lien vers libc sans un main
. Aussi, vous devez utiliser elf32 et non elf64 lors de l'assemblage car le code a des instructions 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
Et construisez avec :
nasm -f elf32 vaja4.asm
gcc -m32 vaja4.o -o vaja4
$./test
$Hello world!!
Modifier :
Puisque vous compilez maintenant du code 32 bits sur un système 64 bits, vous devrez installer la version 32 bits des bibliothèques
apt-get install ia32-libs
Sur Ubuntu 12.10, vous devez d'abord installer les packages de développement
sudo apt-get update
sudo apt-get install libc6-dev-i386
pour
gcc -m32 vaja4.o -o vaja4
travailler.
Je doute que l'erreur que vous voyez soit due à un problème 32/64 bits. L'erreur que vous voyez c'est-à-dire
vaja4.asm:(.text+0x7): undefined reference to `_printf'
vous indique clairement que le symbole _printf n'est pas défini, ce qui signifie que la bibliothèque de la fonction printf n'est pas liée.
votre étape de liaison, c'est-à-dire
ld vaja4.o -o vaja4
n'inclut aucune bibliothèque. Vous devez lier votre programme à une bibliothèque qui peut fournir la définition de la fonction printf. Je pense que ld devrait choisir la bibliothèque elle-même sans vous déranger avec ces messages, mais comme il n'est pas en mesure de trouver une bibliothèque C appropriée pour cette fonction, je suppose que vous n'avez pas les bibliothèques requises, c'est-à-dire qu'il manque une bibliothèque 32 bits ou 64.
Quoi qu'il en soit, veuillez essayer la séquence de commandes suivante pour assembler et lier votre programme :
nasm -f elf vaja4.asm
ld -m elf_i386 vaja4.o vaja4
./vaja4