web-dev-qa-db-ja.com

アセンブリをコンパイルできません:/ usr / bin / ld:入力ファイル `array1.o 'のi386アーキテクチャはi386:x86-64出力と互換性がありません

Kali linux 64ビットを使用しており、PaulCarter博士のWebサイトから次のプログラムを実行しようとしています。 gccコマンドでエラーが発生しています。 gccコマンドで何を使用する必要がありますか?

nasm -f elf32 array1.asm
root@kali:Assembly# gcc -o array1 array1.o array1c.c
array1c.c:9:1: warning: ‘cdecl’ attribute ignored [-Wattributes]
array1c.c:10:1: warning: ‘cdecl’ attribute ignored [-Wattributes]
/usr/bin/ld: i386 architecture of input file `array1.o' is    incompatible    with i386:x86-64 output
collect2: error: ld returned 1 exit status
5
beegee Assem

32ビットオブジェクトファイルをリンクしようとしていますi386から64ビットの実行可能ファイル(i386:x86-64)。追加 -m32gccコンパイル行に追加して、32ビットの実行可能ファイルを作成します。

6
cadaniluk
nasm -f elf64 array1.asm

その後

ld -s -o array1 array1.o
2
Chris Brueck

最初にこれをインストールします:

Sudo apt-get install gcc-multilib g++-multilib

次に、Assemebleと次のようにリンクします。

nasm -f elf array1.asm -o array1.o

そして最後に、

gcc -m32 array1.o -o array1.out

実行し、

./array1.out

これはうまくいくはずです......

2
Habibullah

(おっと、私は質問をざっと読んだだけで、ldだけでスタンドアロンの実行可能ファイルを作成していると思いました。libcなどとリンクしたい場合は、gcc -m32に関するcadの回答を参照してください。スタンドアロンとして少し実験してみるよりも。)

ldに出力の対象となるマシンを指定する必要があります。デフォルトはネイティブタイプです。

nasm -f elf32 array1.asm  # or yasm
ld -m elf_i386 array1.o -o 32bit-array1

残念ながら、多くのasmガイド/リソースには、32ビットx86コードの例がまだあります。

1
Peter Cordes