Проблема сборки / соединения с nasm и ld - PullRequest
6 голосов
/ 11 февраля 2010

У меня есть пример файла сборки, который я компилирую с помощью 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, я добавил директиву BITS 64 в начало файла syscall.asm.

Затем попытка собрать syscall.asm с помощью nasm выдает следующую ошибку:

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-разрядном Fedora Core 11 установлена ​​последняя версия nasm, а моим процессором является Intel Core 2 Duo E7200.

[EDIT]

Мой вопрос заключается в том, как заставить сперму выдавать объектные файлы, совместимые с i386: x86-64.

1 Ответ

9 голосов
/ 11 февраля 2010

Попробуйте использовать 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)
...