macos - 在 Mac OSX 上编译 NASM

标签 macos gcc compiler-construction linker nasm

在学校写一个编译器,最后一个里程碑是生成汇编代码。尝试学习 NASM。从头开始,http://www.cs.lmu.edu/~ray/notes/nasmexamples/ ,试图编译一个Hello World。

; ----------------------------------------------------------------------------
; helloworld.asm
;
; This is a Win32 console program that writes "Hello, World" on one line and
; then exits.  It needs to be linked with a C library.
; ----------------------------------------------------------------------------

    global  _main
    extern  _printf

    section .text
_main:
    push    message
    call    _printf
    add     esp, 4
    ret
message:
    db      'Hello, World', 10, 0

要在 Windows 下组装、链接和运行此程序:
nasm -fwin32 helloworld.asm
gcc helloworld.obj
a

在 Linux 下,您需要从函数名称中删除前导下划线,然后执行
nasm -felf helloworld.asm
gcc helloworld.o
./a.out

但我在 OSX 上。发现这个小资源:http://salahuddin66.blogspot.com/2009/08/nasm-in-mac-os-x.html .在 Mac OS X 中,我们应该使用格式 macho...
nasm -f macho -o hello.o hello.asm

...对于链接器(我们需要指定入口点)...
ld -e main -o hello hello.o

但是当我这样做时...
Undefined symbols:
    "printf", referenced from:
        _main in hello.o
ld: symbol(s) not found for inferred architecture i386

抱歉,我知道要读很多书。我怀疑这些部分周围有很多 NASM 编码器,但值得一试,对吗?我很感激我能得到的任何帮助。

最佳答案

功能 printf在某些 C 库中定义(在 Linux 上,例如 /lib/libc.so.6/lib/x86_64-linux-gnu/libc.so.6 ),因此您需要链接到该库(我不知道它在 MacOSX 上是什么)

你可以直接做system callssyscalls (我不知道 MacOSX 的详细信息,也不知道它们是否公开可用)。在 Linux 上,Linux Assembly Howto给出细节。您需要为您的操作系统找到等效的详细信息。

(顺便说一句,对于此类任务,使用完全免费的软件肯定更容易,因为它们的规范和源代码是可用的;对于像 MacOSX 这样的专有软件,您需要从软件提供商那里获取,有时非常昂贵)

关于macos - 在 Mac OSX 上编译 NASM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8451939/

相关文章:

c++ - 关于匿名命名空间和内部链接的标准是什么?

flash - ActionScript 编译器

cocoa - CALayer ScrollView 因许多项目而变慢

objective-c - 第一次附上一张纸

c - 动态-ffast-math

c++ - 'CXXABI_1.3.1 1' not found`

c# - 哪些 C# 编译器错误未记录?

c++ - reinterpret_cast 更改指针值的任何真实示例?

eclipse - 如何在 MacBook 上的 Eclipse 中显示 "collapse all"?

objective-c - NSWindow 失去焦点时没有收到任何通知