Problema de montagem/vinculação com NASM e LD
Pergunta
Eu tenho um arquivo de montagem de amostra que eu compilar com NASM:
nasm -f elf syscall.asm
Isso gera um syscall.o Arquivo. Eu tento vinculá -lo com LD:
ld -o syscall syscall.o
O comando LD falha com o seguinte erro:
ld: i386 architecture of input file `syscall.o' is incompatible with i386:x86-64 output
No entanto, se eu fizer
ld -o syscall syscall.o -melf_i386
o comando é bem -sucedido e eu recebo um syscall executável.
Descobrindo que o NASM não está gerando código de objeto no formato x86-64, adicionei a diretiva "bits 64" ao início do arquivo syscall.asm.
Em seguida, tentando montar Syscall.asm com NASM deu o seguinte erro:
error: elf output format does not support 64-bit code
Isso parece estranho porque fazer "Arquivo/usr/bin/Nasm" no meu terminal dá:
/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
Meu Fedora Core 11 de 64 bits tem a versão mais recente do NASM instalada e minha CPU é o Intel Core 2 Duo E7200.
EDITAR
Minha pergunta é como obtenho que o NASM emite arquivos de objeto que são compatíveis com i386: x86-64.
Solução
Tente usar elf64
como o formato de saída.
Exemplo de execução:
$ 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)