2010-11-23 33 views
21

私は64ビットUbuntuを使用していて、NASMで.asmファイルを実行しようとしています。しかし、次のコードを実行しようとすると、このエラーが返されます。何イムがやろうとすると、ソース $ nasm -f elf hello.asmからオブジェクトファイルをコンパイル(またはアセンブル)で実行可能ファイルを構築し、その後、後のリンカにUbuntuのNASMで.asmファイルを実行しようとしたときにエラーが発生しました

$ ld -s -o hello hello.o 

これを呼び出すことによってhello.oは、オブジェクトファイルから実行ファイル自体を生産しているファイルを作成しています最終的にhello実行可能ファイルをビルドします。

私はこのチュートリアルに以下のよhttp://www.faqs.org/docs/Linux-HOWTO/Assembly-HOWTO.html

エラー:入力ファイル `hello.oの

のi386アーキテクチャはi386のと互換性がありません:x86-64の出力

コード:

 section .data    ;section declaration 

msg  db  "Hello, world!",0xa ;our dear string 
len  equ  $ - msg     ;length of our dear string 

section .text    ;section declaration 

      ;we must export the entry point to the ELF linker or 
    global _start  ;loader. They conventionally recognize _start as their 
      ;entry point. Use ld -e foo to override the default. 

_start: 

;write our string to stdout 

     mov  edx,len ;third argument: message length 
     mov  ecx,msg ;second argument: pointer to message to write 
     mov  ebx,1 ;first argument: file handle (stdout) 
     mov  eax,4 ;system call number (sys_write) 
     int  0x80 ;call kernel 

    ;and exit 

    mov ebx,0 ;first syscall argument: exit code 
     mov  eax,1 ;system call number (sys_exit) 
     int  0x80 ;call kernel 

答えて

29

これは単純なミスのようですnasmによって生成されますし、何ldが作るしようとしているものとの間にATCH:つまり

i386 architecture of input file 'hello.o' is incompatible with i386:x86-64 output 

nasmは、32ビットのオブジェクトファイルhello.oldはそれを取ると64ビットの実行可能ファイルを作成したい生産しています。

nasm -hfコマンドを使用すると、利用可能な出力形式を与える必要があります。

valid output formats for -f are (`*' denotes default): 
    * bin  flat-form binary files (e.g. DOS .COM, .SYS) 
    ith  Intel hex 
    srec  Motorola S-records 
    aout  Linux a.out object files 
    aoutb  NetBSD/FreeBSD a.out object files 
    coff  COFF (i386) object files (e.g. DJGPP for DOS) 
    elf32  ELF32 (i386) object files (e.g. Linux) 
    elf  ELF (short name for ELF32) 
    elf64  ELF64 (x86_64) object files (e.g. Linux) 
    as86  Linux as86 (bin86 version 0.3) object files 
    obj  MS-DOS 16-bit/32-bit OMF object files 
    win32  Microsoft Win32 (i386) object files 
    win64  Microsoft Win64 (x86-64) object files 
    rdf  Relocatable Dynamic Object File Format v2.0 
    ieee  IEEE-695 (LADsoft variant) object file format 
    macho32 NeXTstep/OpenStep/Rhapsody/Darwin/MacOS X (i386) object files 
    macho  MACHO (short name for MACHO32) 
    macho64 NeXTstep/OpenStep/Rhapsody/Darwin/MacOS X (x86_64) object files 
    dbg  Trace of all info passed to output stage 

私はあなたのリンクのチュートリアルを実行するように要求されますことを参照してください。

nasm -f elf hello.asm 

を使用してみてください:

nasm -f elf64 hello.asm 

代わりにldが入力ファイルについて不平を言うのを見つけるかもしれません。

+0

@psyhclo:これは機能しますか? –

+0

これは本当に正しいアプローチではありません.OPが書いているアセンブリも修正する必要があるからです(たとえば、 '%rax'、'%rbx'の上位32ビットをシステムの前にクリアする必要がありますコール)。 – caf

+0

はい、@caf、そうかもしれません。私自身は、64ビットを実行しているので、コードを変更する方が好きですが、32ビットの実行ファイルを作成する方が望ましい場合があります。おそらくあなたの答えは、おそらくチュートリアルのために行くための最良の方法ですので、物事を取得する最小限の努力のバージョンを提供します。だから+1。 – paxdiablo

9

あなたはi386のアセンブリを書いていることから、i386の出力ファイルを生成するためにリンカに指示する必要があります:、リンクをコンパイルする方法

ld -m elf_i386 -s -o hello hello.o 
+0

同じエラー: ld:i386:入力ファイル 'helloのx86-64アーキテクチャ。o 'はi386の出力と互換性がありません – rogcg

+1

@psyhclo:いいえ、同じエラーではありません。つまり、反対のエラーです。あなたはx86-64出力を作成するように 'nasm'にも指示したからです。どちらか一方または両方を実行しないでください! (i386出力を作成することを強くお勧めします。これは、最初に 'nasm'を呼び出すことを意味し、この方法で' ld'を呼び出すことです。実際はx86-64ではなくi386アセンブラを書くからです)。 – caf

3

、およびUbuntuの64ビットにNASMアプリを実行します。

インストールNASM:

sudo apt-get install nasm 

保存ファイル名hello.asmを持つファイル:

section .data 
    hello:  db 'Hello world!',10 ; 'Hello world!' plus a linefeed character 
    helloLen: equ $-hello    ; Length of the 'Hello world!' string 
            ; (I'll explain soon) 

section .text 
    global _start 

_start: 
    mov eax,4   ; The system call for write (sys_write) 
    mov ebx,1   ; File descriptor 1 - standard output 
    mov ecx,hello  ; Put the offset of hello in ecx 
    mov edx,helloLen  ; helloLen is a constant, so we don't need to say 
         ; mov edx,[helloLen] to get it's actual value 
    int 80h    ; Call the kernel 

    mov eax,1   ; The system call for exit (sys_exit) 
    mov ebx,0   ; Exit with return code of 0 (no error) 
    int 80h 

がそれをコンパイルします。

nasm -f elf64 hello.asm 

リンクを:それ

[email protected]:~$ ./hello 
Hello world! 

ld -s -o hello hello.o 

実行して、それが動作します!今何?好きなコンパイラが、マシンコードに変換するために通常渡されたアセンブリコードを生成するように要求します。 Google検索:

視点「アセンブリへのPHP/Javaの/パイソン/ C++プログラムに変換」:取り壊すと一般向けの汎用コンピューティングを取り除くしようとするすべての人々今日でを、それは我々が教えることが不可欠です新しい学生は、コア原理、ベアメタル、最終的にアセンブラとプログラミング言語から汎用チューリングマシンを構築する方法の概念を学びます。

プログラミングの学習支援はどのようにして行われますか? コンピュータプログラムの99%は、彼らが好きな高水準のコンパイラやインタプリタによって遅延されていることをプログラマが知らないので、最適化できるよりも10〜100倍遅くなります。

ここで完全なスタックを完全に理解すると、あなたのプログラムが、ナノ秒を取るだけの欲求を持っていると強く訴えることができます。時間==お金。だから、何ナノ秒もかからず時間がかかるものを避けるためのこの知識は、時間とそれゆえにお金を節約します。

https://softwareengineering.stackexchange.com/questions/156722/how-does-learning-assembly-aid-in-programming

+0

ありがとうございました、私はIDEとしてSasmを使用していましたが、リンカに-m64のようなオプションがあり、-gは私にトラブルを与えていました... BTW clean answer .... – HoNgOuRu

関連する問題