15

私は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'
4

4 に答える 4

23

最初ににシンボルを変更_printfし、次にオブジェクトファイルをリンクするために使用します。これにより、オブジェクトファイルが自動的にリンクされます。AFAIKでは。がないとlibcにリンクできないため、これを行う必要があります。また、コードには32ビットの命令があるため、アセンブルするときはelf64ではなくelf32を使用する必要があります。printf_startmaingcclibcmain

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 
于 2012-11-01T14:26:30.433 に答える
8

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

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

にとって

gcc -m32 vaja4.o -o vaja4

働くために。

于 2013-04-17T01:23:41.140 に答える
4

表示されるエラーが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
于 2012-11-01T13:58:16.253 に答える
1

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

ld vaja4.o -o vaja4 -lc
于 2012-11-01T13:57:59.810 に答える