web-dev-qa-db-ja.com

64ビットubuntuで32ビットアセンブラをコンパイルする

私は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'
12
Klemenko

最初の変更_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 
20
iabdalkader

Ubuntu 12.10では、最初に開発パッケージをインストールする必要があります

Sudo apt-get update
Sudo apt-get install libc6-dev-i386

for

gcc -m32 vaja4.o -o vaja4

働くために。

7
bit_pusher

表示されるエラーが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
4
binW

printf関数(およびその他)を提供する部分であるCライブラリに対してリンクするのを忘れたように私には見えます。

ld vaja4.o -o vaja4 -lc
1
Nikos C.