macos - 无法使用 ld 在 Mac OS X 中链接程序集文件

标签 macos assembly nasm ld object-files


我正在尝试使用 64 位 Mac OS X Lion 运行基本的程序集文件,并使用默认随 Xcode 安装的 nasm 和 ld。

我编写了一个汇编文件,它可以打印一个字符,并且我使用 nasm 来构建它。

nasm -f elf -o program.o main.asm

但是,当我将它与 ld 链接时,它失败并出现很多错误/警告:

ld -o 程序program.o

ld: warning: -arch not specified
ld: warning: -macosx_version_min not specificed, assuming 10.7
ld: warning: ignoring file program.o, file was built for unsupported file format which is not the architecture being linked (x86_64)
ld: warning: symbol dyld_stub_binder not found, normally in libSystem.dylib
ld: entry point (start) undefined.  Usually in crt1.o for inferred architecture x86_64

因此,我尝试纠正其中一些问题,但一无所获。

这是我尝试过的其中一件事:

ld -arch i386 -e _start -o 程序program.o

我认为这会起作用,但我错了。

如何使目标文件成为 nasm 和 ld 都同意的兼容架构?

此外,您将如何定义程序中的入口点(现在我在 .section text 中使用 global _start,即上面的 _start,这似乎没有多大作用。)

我对如何使用 ld 成功地将目标文件链接到二进制文件感到有点困惑,我想我只是缺少一些使他们同意的代码(或 nasm 或 ld 的参数)。

感谢任何帮助。

最佳答案

您需要使用全局开始开始:无下划线。另外,您不应该使用 elf 作为 arch。这是我用来在 Mac OS X 上组装 x86-64 NASM 程序的 bash 脚本:

#!/bin/bash

if [[ -n "$1" && -f "$1" ]]; then
    filename="$1"
    base="${filename%%.*}"
    ext="${filename##*.}"

    nasm -f macho64 -Ox "$filename" \
    && ld -macosx_version_min 10.7 "${base}.o" -o "$base"
fi

如果您有一个名为 foo.s 的文件,该脚本将首先运行

nasm -f macho64 -Ox foo.s

这将创建foo.o-Ox 标志使 NASM 对跳跃进行一些额外的优化(即使它们短、近或远),这样您就不必自己做。我使用的是 x86-64,所以我的代码是 64 位的,但看起来您正在尝试汇编 32 位。在这种情况下,您可以使用 -f macho32。有关有效输出格式的列表,请参阅 nasm -hf

现在,目标文件将被链接:

ld -macosx_version_min 10.7 foo.o -o foo

我设置了 -macosx_version_min 选项来安静 NASM 并防止出现警告。您不必将其设置为 Lion (10.7)。这将创建一个名为 foo 的可执行文件。运气好的话,输入 ./foo 并按回车键应该会运行您的程序。

关于ld:警告:符号dyld_stub_binder未找到,通常在libSystem.dylib警告,我每次也得到这个,我不知道为什么,但当我时一切似乎都很好运行可执行文件。

关于macos - 无法使用 ld 在 Mac OS X 中链接程序集文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6957488/

相关文章:

linux - 在 ubuntu 11.10 上安装 NASM

eclipse - Mac 上的 Git 设置(错误 : "-bash: git: command not found")

算术中的汇编位内存限制

macos - NSPopover + NSBox 的深色模式色调/ Gamma 问题

C# 或 C++ 沙盒程序集

c++ - GCC 内联 ASM 保证

c++ - 如何跨内核同步 TSC?

linux - x86 汇编字符串缓冲区编号到 ASCII

OS X 上的 Java 7 不显示在任何地方,但在控制台中

macos - 从 sdkmanager CLI 截断的 Android SDK 包路径