2012-02-16 7 views
6

Tôi đã đọc this bài viết, và tại một thời điểm nó mang lại cho tôi chương trình NASM này:NASM/vấn đề gcc trên 64-bit Mac OS X Lion

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

Và nói với tôi để chạy các lệnh sau:

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

tôi đã nhận lỗi sau:

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 

tôi mạo hiểm một đoán những gì có thể là vấn đề, và thay đổi dòng BITS để đọc:

BITS 64 

Nhưng sau đó khi tôi chạy nasm -f elf tiny.asm tôi nhận được:

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

Làm thế nào để thay đổi mã để làm việc trên máy tính của tôi?

Chỉnh sửa:

Tôi lấy lời khuyên của Alex từ các nhận xét và tải xuống phiên bản mới hơn. Tuy nhiên,

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

phàn nàn

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

Mặt khác,

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

phàn nàn

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

Kiểm tra xem bạn có co thắt mới nhất hay không và thử '-f elf64'. –

+0

@Alex elf64 đã cho tôi "định dạng đầu ra không được công nhận". Đối với phiên bản, nasm -v đã cho tôi "phiên bản NASM 0.98.40 (Apple Computer, Inc. build 11) được biên soạn vào ngày 3 tháng 11 năm 2011" 0.98 có vẻ như nó có thể là một phiên bản cũ nhưng nó đã được biên soạn vào năm 2011 vì vậy nó không thể là quyền cũ? Tại sao Apple lại xuất xưởng phần mềm lỗi thời? Trình kết hợp mặc định không thể tập hợp mã 64 bit trên nền tảng 64 bit? – math4tots

+0

Bạn đã quá lỗi thời. Bản in của tôi "NASM phiên bản 2.09.10 được biên soạn vào ngày 15 tháng 7 năm 2011". Phiên bản mới hơn là [ở đây] (http://www.nasm.us/pub/nasm/releasebuilds/2.09.10/). –

Trả lời

13

Có OS điều chỉnh X-cụ thể mà bạn cần phải thực hiện theo thứ tự cho ví dụ của bạn để làm việc: Phương pháp chính được thêm vào phía trước với một _ bởi mối liên kết OS X:

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

Thứ hai là bạn phải sử dụng các định dạng file mach:

nasm -f macho tiny.asm 

Bây giờ bạn có thể liên kết nó (sử dụng - m32 để biểu thị một tệp đối tượng 32 bit):

gcc -m32 tiny.o 
+1

+1. Hoàn toàn quên nó là "mach". –

2

Có vẻ như bạn vẫn đang sử dụng phiên bản 32 bit. Nếu bạn nasm -hf cần liệt kê macho64. Nếu không, bạn sẽ cần cập nhật lại.

Bạn có thể thử trong bảng điều khiển brew update. Nếu điều này thực hiện một bản cập nhật thì brew search nasm nơi nó sẽ mang lại nasm. Sau đó, chỉ cần brew install nasm. Điều này sẽ cài đặt nasm vào máy tính của bạn. Hãy chắc chắn chắc chắn để tìm ra cho các vị trí nơi nó được cài đặt. Mỏ đã được cài đặt tại /usr/local/cellar/nasm/2.11.02/bin/. Sau đó, bằng cách nhập nasm -hf, danh sách này sẽ hiển thị danh sách các định dạng có sẵn mà bạn sẽ thấy macho64 khả dụng.