【问题标题】:How to compile using nasm on MacOSX如何在 MacOSX 上使用 nasm 进行编译
【发布时间】:2012-12-15 17:34:50
【问题描述】:

我正在尝试在 Assembler 上编译和链接我的第一个程序。 我尝试编译以下代码:

; %include "stud_io.inc"    
global _main     

section .text
_main: 
    xor eax, eax
again:
    ; PRINT "Hello"
    ; PUTCHAR 10
    inc eax     
    cmp eax, 5
    jl again

在编译和链接程序的控制台命令下方:

-bash-3.2$ nasm -f macho main.asm -o main.o  && ld -e _main -macosx_version_min 10.8 -arch x86_64 main.o

但结果是:

ld: warning: ignoring file main.o, file was built for i386 which is not the architecture being linked (x86_64): main.o
Undefined symbols for architecture x86_64:
  "_main", referenced from:
     -u command line option
ld: symbol(s) not found for architecture x86_64

我认为有必要为 x86_64 编译 main.asm 文件。 如何为我的系统正确编译程序?

【问题讨论】:

  • nasm 无法识别此选项
  • 你运行的是什么版本的 nasm?
  • -bash-3.2$ nasm -v NASM 版本 0.98.40(Apple Computer, Inc. build 11)于 2012 年 8 月 4 日编译
  • 那个版本的 nasm 已经过时了。看nasm.us/pub/nasm/releasebuilds/2.10

标签: assembly nasm


【解决方案1】:

我建议先更新您的NASM

之后,尝试运行:

nasm -f macho64 main.asm -o main.o  && ld -e _main -macosx_version_min 10.8 -arch x86_64 main.o -lSystem

请注意,新命令在上面添加了 JasonD 的建议 (macho64),但还在 ld 命令中添加了-lSystem 以阻止 ld 抛出以下错误:

ld: dynamic main executables must link with libSystem.dylib for architecture x86_64

【讨论】:

  • 段错误是代码执行的问题。在jl 指令之后,添加ret 指令(因为您使用的是主指令)。请注意,如果您使用的是纯 x86 程序集,则需要使用 int 0x80 中的 exit 系统调用退出(但在这种情况下不是)。请记住,当您的代码完成后,PC 计数器需要知道去哪里继续执行。
  • ld -lSystem my.o -e _main -macosx_version_min 10.14 -o exit 结果-> cannot execute binary file
【解决方案2】:

我注意到大多数示例显示了独立的汇编程序,但从 C 调用汇编可能更常见。我创建了一个简单的 C 程序,它使用这样的最小 nasm 汇编函数:

extern unsigned cpuid(unsigned n);

/* ... */
        unsigned n = cpuid(1);

程序集如下所示:

section .text
    global _cpuid

_cpuid:
    push rbp
    mov rbp, rsp
    mov rax, rdi
    cpuid
    mov rax, rcx
    leave
    ret

您可以在此处查看全部内容,包括 makefile 中的 nasm CLI 选项:

https://github.com/ecashin/low/tree/master/cpuid

它通过打印出一些特定于 CPU 的功能的可用性来做一些稍微有用的事情。 (但它通过使用 CPUID 而不检查它是否可用来做到这一点。不过,如果 CPU 是 Intel 并且比 i486 更新,那很好。)

该示例在 Mac OS X Snow Leopard 上使用 ports 集合中的 nasm 进行了测试。移除下划线前缀是移植到 Linux x86_64 所需的唯一更改。

【讨论】:

  • 另外,我确实需要更新 NASM,就像这里的其他 cmets 所说的那样,我才能使用 -fmacho64
【解决方案3】:

也许尝试静态链接?

ld -macosx_version_min 10.13 -e _main -static main.o

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-17
    • 2012-01-17
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 2019-11-25
    • 2013-02-06
    • 1970-01-01
    相关资源
    最近更新 更多