64位Mac OS X Lion上的nasm / gcc问题

时间:2012-02-16 09:41:42

标签: macos gcc nasm

我正在阅读this文章, 有一次,它给了我这个鼻子程序:

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

并告诉我运行以下命令:

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

我收到以下错误:

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

我冒昧地猜测可能是什么问题,并将BITS行改为:

 BITS 64

但是当我运行nasm -f elf tiny.asm时,我得到了:

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

如何修改代码才能在我的机器上运行?

编辑:

我从评论中获取了Alex的建议并下载了更新的版本。然而,

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

抱怨

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

另一方面,

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

抱怨

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

2 个答案:

答案 0 :(得分:14)

为了让您的示例有效,您必须进行特定于操作系统X的调整: 主要方法在OS X链接器前面加上_:

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

第二个是你必须使用马赫文件格式:

nasm -f macho tiny.asm

现在您可以链接它(使用-m32表示32位目标文件):

gcc -m32 tiny.o

答案 1 :(得分:2)

您似乎仍在使用32位版本。如果您nasm -hf,则应列出macho64。如果不是,您需要再次更新。

您可以在控制台brew update中尝试。如果这会执行更新,那么brew search nasm应该会显示nasm。然后只需brew install nasm。这应该将nasm安装到您的计算机上。请务必注意安装位置。我的安装在/usr/local/cellar/nasm/2.11.02/bin/。然后输入nasm -hf,它应该会显示可用格式的列表,您应该看到macho64可用。