У меня есть демонстрационный файл блока, который я компилирую с 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 формате, я добавил "БИТЫ 64" директивы к началу syscall.asm файла.
Затем попытка собрать syscall.asm с nasm дала следующую ошибку:
error: elf output format does not support 64-bit code
Это кажется странным, потому что выполнение "файла/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 11 имеет последнюю версию установленного nasm, и моим ЦП является Intel Core 2 Duo E7200.
[Править]
Мой вопрос состоит в том, как я заставляю nasm испускать объектные файлы, который совместим с i386:x86-64.
Попробуйте использовать 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)