2010-02-11 17 views
5

Tengo un archivo de ensamblaje de ejemplo que compilo con nasm:Asamblea/problema Vinculación con nasm y LD

nasm -f elf syscall.asm 

Esto genera un archivo syscall.o. Trato de vincularlo con ld:

ld -o syscall syscall.o 

El comando ld falla con el siguiente error:

ld: i386 architecture of input file `syscall.o' is incompatible with i386:x86-64 output 

Sin embargo, si lo hago

ld -o syscall syscall.o -melf_i386 

el comando tiene éxito y me da una syscall ejecutable.

Al calcular que nasm no está generando código de objeto en formato x86-64, agregué la directiva "BITS 64" al comienzo del archivo syscall.asm.

Luego de intentar montar syscall.asm con nasm dio el siguiente error:

error: elf output format does not support 64-bit code 

Eso parece extraño porque hacerlo "archivo/usr/bin/nasm" en mi terminal da:

/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 

Mi Fedora Core 11 de 64 bits tiene instalada la última versión de Nasm y mi CPU es Intel Core 2 Duo E7200.

[EDIT]

Mi pregunta es ¿cómo consigo nasm para emitir ficheros objeto que sea compatible con i386: x86-64.

+0

Entonces, ¿cuál es la pregunta? – wallyk

Respuesta

8

Pruebe usar elf64 como formato de salida.

Ejemplo de ejecución:

$ 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) 
+0

Guau, eso funcionó. Gracias. – ardsrk

Cuestiones relacionadas