2012-02-16 11 views
6

estaba leyendo this artículo, y en un momento me da este programa nasm:nasm/tema gcc en 64 bits de Mac OS X Lion

; tiny.asm 
BITS 32 
GLOBAL main 
SECTION .text 
main: 
       mov  eax, 42 
       ret 

y me dice que ejecute los siguientes comandos:

$ nasm -f elf tiny.asm 
$ gcc -Wall -s tiny.o 

me dieron el siguiente error:

ld: warning: option -s is obsolete and being ignored 
ld: warning: ignoring file tiny.o, file was built for unsupported file format which is not the architecture being linked (x86_64) 
Undefined symbols for architecture x86_64: 
    "_main", referenced from: 
     start in crt1.10.6.o 
ld: symbol(s) not found for architecture x86_64 
collect2: ld returned 1 exit status 

me aventuré a adivinar lo que podría ser el problema, y ​​ha cambiado la línea de BITS para leer:

BITS 64 

Pero cuando corro nasm -f elf tiny.asm me sale:

tiny.asm:2: error: `64' is not a valid segment size; must be 16 or 32 

¿Cómo modificar el código para trabajar en mi máquina?

Editar:

que siguió el consejo de Alex de los comentarios y descargar una versión más reciente. Sin embargo,

./nasm-2.09.10/nasm -f elf tiny.asm 

se queja

tiny.asm:2: error: elf32 output format does not support 64-bit code 

Por otro lado,

./nasm-2.09.10/nasm -f elf64 tiny.asm 
gcc -Wall -s tiny.o 

se queja

ld: warning: ignoring file tiny.o, file was built for unsupported file format which is not the architecture being linked (x86_64) 
Undefined symbols for architecture x86_64: 
    "_main", referenced from: 
     start in crt1.10.6.o 
ld: symbol(s) not found for architecture x86_64 
collect2: ld returned 1 exit status 
+0

Comprueba si tienes la última nasm y prueba '-f elf64'. –

+0

@Alex elf64 me dio "formato de salida no reconocido". En cuanto a la versión, nasm -v me dio "NASM versión 0.98.40 (Apple Computer, Inc. compilación 11) compilada el 3 de noviembre de 2011" 0.98 parece que podría ser una versión anterior, pero fue compilada en 2011, por lo que no puede ser tan antigua ¿verdad? ¿Por qué Apple enviaría un software obsoleto? ¿Un ensamblador predeterminado que no puede ensamblar código de 64 bits en una plataforma de 64 bits? – math4tots

+0

La tuya está horriblemente desactualizada. La mina imprime "NASM versión 2.09.10 compilada el 15 de julio de 2011". La versión más nueva es [aquí] (http://www.nasm.us/pub/nasm/releasebuilds/2.09.10/). –

Respuesta

13

Hay OS ajustes X-específicos que tiene que hacer con el fin para que su ejemplo funcione: El principal método se antepone con una _ por el enlazador OS X:

; tiny.asm 
BITS 32 
GLOBAL _main 
SECTION .text 
_main: 
    mov  eax, 42 
    ret 

La segunda es que usted tiene que usar el formato de archivo de Mach:

nasm -f macho tiny.asm 

Ahora puede vincularlo (utilizando - m32 para indicar un archivo de objeto de 32 bits):

gcc -m32 tiny.o 
+1

+ 1'ed. Olvidé por completo que era "mach". –

2

Parece que todavía está utilizando la versión de 32 bits. Si nasm -hf debe listar macho64. Si no, deberás actualizar nuevamente.

Puede probar en la consola brew update. Si esto realiza una actualización, entonces brew search nasm donde debe aparecer nasm. Entonces simplemente brew install nasm. Esto debería instalar Nasm en tu computadora. Asegúrese de buscar la ubicación donde se instaló. El mío se instaló en /usr/local/cellar/nasm/2.11.02/bin/. Luego, al escribir nasm -hf, debería aparecer una lista de formatos disponibles que debería ver macho64 disponible.