GNU/Linux >> Linux の 問題 >  >> Linux

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

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

Linux
  1. Ubuntu 12.04でChromeのインストールに失敗しましたか?

  2. Ubuntu20.04をUbuntu21.04にアップグレードする方法

  3. 自分の PC (>10 年) で 64 ビットの ubuntu を実行できますか?

  1. rTorrent –UbuntuLinuxのコマンドラインビットTorrentクライアント

  2. Ubuntu 20.04にLibncurses.so.5をインストールするにはどうすればいいですか?

  3. 32ビットUbuntuにMongodbをインストールするにはどうすればよいですか?

  1. Bashprintfコマンド

  2. Ubuntu20.04LTSにAngularをインストールする方法

  3. Ubuntuで最初のQtプログラムをコンパイルする