Ändern Sie zuerst _printf
bis printf
und die _start
Symbol zu main
, dann verwenden Sie gcc
um die Objektdatei zu verknüpfen, wodurch sie automatisch mit libc
verknüpft wird , Sie müssen das tun, weil Sie AFAIK ohne main
nicht auf libc verlinken können . Außerdem sollten Sie beim Assemblieren elf32 und nicht elf64 verwenden, da der Code 32-Bit-Anweisungen enthält:
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
Und bauen Sie mit:
nasm -f elf32 vaja4.asm
gcc -m32 vaja4.o -o vaja4
$./test
$Hello world!!
Bearbeiten:
Da Sie jetzt 32-Bit-Code auf einem 64-Bit-System kompilieren, müssen Sie die 32-Bit-Version der Bibliotheken installieren
apt-get install ia32-libs
Unter Ubuntu 12.10 müssen Sie zuerst Entwicklungspakete installieren
sudo apt-get update
sudo apt-get install libc6-dev-i386
für
gcc -m32 vaja4.o -o vaja4
zu arbeiten.
Ich bezweifle, dass der angezeigte Fehler auf ein 32/64-Bit-Problem zurückzuführen ist. Der Fehler, den Sie sehen, dh
vaja4.asm:(.text+0x7): undefined reference to `_printf'
sagt Ihnen eindeutig, dass das Symbol _printf undefiniert ist, was bedeutet, dass die Bibliothek für die printf-Funktion nicht verknüpft wird.
Ihr Verknüpfungsschritt, d.h.
ld vaja4.o -o vaja4
enthält keine Bibliotheken. Sie müssen Ihr Programm mit einer Bibliothek verknüpfen, die die Definition der printf-Funktion bereitstellen kann. Ich glaube, ld sollte die Bibliothek selbst auswählen, ohne Sie mit diesen Meldungen zu belästigen, aber da es keine geeignete C-Bibliothek für diese Funktion finden kann, haben Sie vermutlich nicht die erforderlichen Bibliotheken, dh entweder die 32-Bit- oder die 64-Bit-Bibliothek fehlt.
Wie auch immer, versuchen Sie bitte die folgende Befehlsfolge, um Ihr Programm zu assemblieren und zu linken:
nasm -f elf vaja4.asm
ld -m elf_i386 vaja4.o vaja4
./vaja4