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.

Foi útil?

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)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top