私は32ビットのアセンブリ言語で書かれたプログラムを持っています...今は64ビットのOSでそれをコンパイルすることができません。私たちの学校ではそれらは特定のものであり、プログラムは32ビットバージョンで作成する必要があります。これが私のプログラムです:
bits 32
extern _printf
global _start
section .data
message db "Hello world!!", 10, 0
section .text
_start:
pushad
Push dword message
call _printf
add esp, 4
popad
ret
何か案が?私はそれをコンパイルするために非常に多くの方法を試しました。コンパイル後のエラー出力:
nasm -f elf64 vaja4.asm
ld vaja4.o -o vaja4
./vaja4
出力:
vaja4.o: In function `_start':
vaja4.asm:(.text+0x7): undefined reference to `_printf'
最初の変更_printf
からprintf
および_start
シンボルをmain
に、次にgcc
を使用してオブジェクトファイルをリンクします。これにより、オブジェクトファイルが自動的にlibc
にリンクされますこれを行う必要がありますAFAIKは、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!!
ここに素敵なチュートリアルがあります:
http://jdefr.swippet.com/2012/03/22/using-libc-with-Assembly/
編集:
現在、64ビットシステムで32ビットコードをコンパイルしているため、32ビットバージョンのライブラリをインストールする必要があります。
apt-get install ia32-libs
Ubuntu 12.10では、最初に開発パッケージをインストールする必要があります
Sudo apt-get update
Sudo apt-get install libc6-dev-i386
for
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ライブラリが不足していると思います。
とにかく、plzは次の一連のコマンドを試して、プログラムをアセンブルおよびリンクします。
nasm -f elf vaja4.asm
ld -m elf_i386 vaja4.o vaja4
./vaja4
printf
関数(およびその他)を提供する部分であるCライブラリに対してリンクするのを忘れたように私には見えます。
ld vaja4.o -o vaja4 -lc