Проблема со сборкой / связыванием с nasm и ld
Вопрос
У меня есть пример файла сборки, который я компилирую с помощью nasm:
nasm -f elf syscall.asm
Это генерирует системный вызов.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
команда выполняется успешно, и я получаю системный вызов исполняемый файл.
Выяснив, что 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.
[ПРАВИТЬ]
Мой вопрос заключается в том, как мне заставить 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)