7

nasmでコンパイルしたサンプルアセンブリファイルがあります。

nasm -f elf syscall.asm 

これにより、syscall.oファイルが生成されます。私はそれをldとリンクしようとします:

ld -o syscall syscall.o

ldコマンドは、次のエラーで失敗します。

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

しかし、私がそうするなら

ld -o syscall syscall.o -melf_i386

コマンドは成功し、syscall実行可能ファイルを取得します。

nasmがx86-64形式のオブジェクトコードを生成していないことを確認し、syscall.asmファイルの先頭に「BITS64」ディレクティブを追加しました。

次に、nasmを使用してsyscall.asmをアセンブルしようとすると、次のエラーが発生しました。

error: elf output format does not support 64-bit code

私の端末で「file/usr / bin / nasm」を実行すると、次のようになるため、これは奇妙に思えます。

/usr/bin/nasm: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped

私の64ビットFedoraCore11には最新バージョンのnasmがインストールされており、私のCPUはIntel Core 2DuoE7200です。

[編集]

私の質問は、nasmにi386:x86-64と互換性のあるオブジェクトファイルを出力させる方法です。

4

1 に答える 1

10

elf64出力形式として使用してみてください。

実行例:

$ cat elf64.asm
section .text
        jmp [rax]
$ nasm -f elf64 elf64.asm
$ objdump -Sr elf64.o

elf64.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <.text>:
   0:   ff 20                   jmpq   *(%rax)
于 2010-02-11T18:46:34.907 に答える