2012-02-16 12 views
6

czytałem this artykuł, iw pewnym momencie daje mi ten program nasm:nasm/gcc problem na 64-bitowym systemie Mac OS X Lion

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

i mówi mi, aby uruchomić następujące polecenia:

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

mam następujący błąd:

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 

zaryzykowałem przypuszczenie co co może być przyczyną problemu, i zmienił linię bitów do odczytu:

BITS 64 

Ale kiedy biegnę nasm -f elf tiny.asm uzyskać:

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

Jak zmodyfikować kod, aby pracować na moim komputerze?

Edit:

Wziąłem porady Alexa z uwagami i pobrać nowszą wersję. Jednak

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

narzeka

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

Z drugiej strony,

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

narzeka

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

Sprawdź, czy masz najnowszą nasm i wypróbuj '-f elf64'. –

+0

@Alex elf64 dał mi "nierozpoznany format wyjściowy". Jeśli chodzi o wersję, nasm -v dał mi "wersję NASM 0.98.40 (Apple Computer, Inc. build 11) skompilowaną 3 listopada 2011 r." 0.98 wygląda na starą wersję, ale została skompilowana w 2011 roku, więc nie może być tak stara prawda? Dlaczego firma Apple ma przestarzałe oprogramowanie? Domyślny asembler, który nie może złożyć 64-bitowego kodu na platformie 64-bitowej? – math4tots

+0

Twoje jest strasznie nieaktualne. Mine prints "NASM wersja 2.09.10 skompilowana 15 lipca 2011". Nowsza wersja to [tutaj] (http://www.nasm.us/pub/nasm/releasebuilds/2.09.10/). –

Odpowiedz

13

Istnieje OS X specyficzne regulacje trzeba zrobić w celu na przykład do pracy: Główną metodą jest poprzedzany z _ przez OS X łącznikiem:

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

Drugim jest to, że trzeba użyć formatu pliku mach:

nasm -f macho tiny.asm 

Teraz można go połączyć (za pomocą - m32, aby wskazać plik obiektowy 32 bit):

gcc -m32 tiny.o 
+1

+ 1'ed. Całkowicie zapomniałem, że to "mach". –

2

wydaje nadal używasz wersji 32-bitowej. Jeśli masz nasm -hf, powinien on zawierać macho64. Jeśli nie, musisz zaktualizować ponownie.

Możesz wypróbować w konsoli brew update. Jeśli to spowoduje aktualizację, to brew search nasm, gdzie powinien wywołać nasm. Następnie po prostu brew install nasm. To powinno zainstalować nasm na twoim komputerze. Pamiętaj, aby sprawdzić lokalizację, w której został zainstalowany. Kopalnia została zainstalowana pod adresem /usr/local/cellar/nasm/2.11.02/bin/. Następnie wpisując nasm -hf powinien wyświetlić listę dostępnych formatów, które powinieneś zobaczyć: macho64.

Powiązane problemy