最初の変更 _printf
printf
まで そして _start
記号を main
に 、次に gcc
を使用します オブジェクトファイルをリンクします。これにより、自動的に libc
にリンクされます 、これを行う必要があるのは、私の知る限り、main
なしでは libc にリンクできないためです。 .また、コードには 32 ビットの命令があるため、アセンブル時には elf64 ではなく elf32 を使用する必要があります:
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
そしてビルド:
nasm -f elf32 vaja4.asm
gcc -m32 vaja4.o -o vaja4
$./test
$Hello world!!
編集:
64 ビット システムで 32 ビット コードをコンパイルしているので、ライブラリの 32 ビット バージョンをインストールする必要があります
apt-get install ia32-libs
Ubuntu 12.10 では、最初に開発パッケージをインストールする必要があります
sudo apt-get update
sudo apt-get install libc6-dev-i386
のために
gcc -m32 vaja4.o -o vaja4
表示されるエラーは 32/64 ビットの問題によるものとは思えません。表示されるエラー、つまり
vaja4.asm:(.text+0x7): undefined reference to `_printf'
シンボル _printf が未定義であることを明確に示しています。これは、printf 関数のライブラリがリンクされていないことを意味します。
あなたのリンク手順、つまり
ld vaja4.o -o vaja4
ライブラリは含まれません。 printf 関数の定義を提供できるライブラリとプログラムをリンクする必要があります。これらのメッセージに煩わされることなく、ld はライブラリ自体を選択する必要があると思いますが、この関数に適した C ライブラリを見つけることができないため、必要なライブラリ、つまり 32 ビットまたは 64 ライブラリが不足していると思います。
いずれにせよ、次の一連のコマンドを試して、プログラムをアセンブルしてリンクしてください:
nasm -f elf vaja4.asm
ld -m elf_i386 vaja4.o vaja4
./vaja4