ld 链接器错误 - 架构 x86_64 的未定义符号

2024-07-03

我正在尝试链接一个单模块汇编语言程序yasm我收到以下错误ld:

Undefined symbols for architecture x86_64:
  "start", referenced from:
     implicit entry/start for main executable
     (maybe you meant: _start)
ld: symbol(s) not found for inferred architecture x86_64

实际上,我半定期地遇到此错误,所以我认为这是一个相当常见的问题,但不知何故,似乎没有人有令人满意的答案。在有人说这是上一个问题的重复之前,是的,我知道。正如您可以看到巨大的文本墙中类似标题的问题,并发现这是重复的,我也可以。

编译器错误:架构 x86_64 的未定义符号 https://stackoverflow.com/questions/15145346/compiler-error-undefined-symbols-for-architecture-x86-64

不适用于我的问题。我不是用 C++ 编码,并且该问题中给出的解决方案对于该语言来说是特殊的。

编译 C 程序时体系结构 x86_64 的未定义符号 https://stackoverflow.com/questions/29073978/undefined-symbol-for-architecture-x86-64-in-compiling-c-program

也不能解决我的问题,因为我没有尝试将多个对象文件链接在一起。

错误未定义架构 x86_64 的符号: https://stackoverflow.com/questions/39896742/error-undefined-symbols-for-architecture-x86-64

解决方案与高级语言的特定框架有关。

编译器错误:架构 x86_64 的未定义符号 https://stackoverflow.com/questions/15145346/compiler-error-undefined-symbols-for-architecture-x86-64

解决方案涉及修复函数原型。由于显而易见的原因不适用于此处。

...你明白了。我能找到的每个过去的问题都是通过一些不适用于我的情况的特殊方法来解决的。

请在这件事上给予我帮助。我厌倦了一次又一次地遇到这个错误,却无法对此采取任何措施,因为它的记录太少了。恕我直言,世界迫切需要一本相当于 MS-DOS 错误代码参考手册的 GNU 开发工具。

附加信息:

操作系统:Mac OS X El Capitan

来源清单:

segment .text
global _start

_start:
    mov     eax,1   ; 1 is the syscall number for exit
    mov     ebx,5   ; 5 is the value to return
    int     0x80    ; execute a system call

目标文件的十六进制转储,显示该符号确实是_start并不是start:

00000000  cf fa ed fe 07 00 00 01  03 00 00 00 01 00 00 00  |................|
00000010  02 00 00 00 b0 00 00 00  00 00 00 00 00 00 00 00  |................|
00000020  19 00 00 00 98 00 00 00  00 00 00 00 00 00 00 00  |................|
00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000040  0c 00 00 00 00 00 00 00  d0 00 00 00 00 00 00 00  |................|
00000050  0c 00 00 00 00 00 00 00  07 00 00 00 07 00 00 00  |................|
00000060  01 00 00 00 00 00 00 00  5f 5f 74 65 78 74 00 00  |........__text..|
00000070  00 00 00 00 00 00 00 00  5f 5f 54 45 58 54 00 00  |........__TEXT..|
00000080  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000090  0c 00 00 00 00 00 00 00  d0 00 00 00 00 00 00 00  |................|
000000a0  00 00 00 00 00 00 00 00  00 00 00 80 00 00 00 00  |................|
000000b0  00 00 00 00 00 00 00 00  02 00 00 00 18 00 00 00  |................|
000000c0  dc 00 00 00 01 00 00 00  ec 00 00 00 08 00 00 00  |................|
000000d0  b8 01 00 00 00 bb 05 00  00 00 cd 80 01 00 00 00  |................|
000000e0  0f 01 00 00 00 00 00 00  00 00 00 00 00 5f 73 74  |............._st|
000000f0  61 72 74 00                                       |art.|
000000f4

32 位 OS/X 代码通过 int 0x80 进行系统调用

代码:

segment .text
global _start

_start:
    mov     eax,1   ; 1 is the syscall number for exit
    mov     ebx,5   ; 5 is the value to return
    int     0x80    ; execute a system call

建议您使用 32 位 Linux 教程。我做出这个结论是因为32 位 Linux ABI https://www.uclibc.org/docs/psABI-i386.pdf使用寄存器将参数传递给内核int 0x80。 OS/X 则不同。您在堆栈上传递参数(从右到左传递它们)。在 32 位 OS/X 中,它看起来像:

global start

section .text
start:
    ; sys_write syscall
    ; See: https://opensource.apple.com/source/xnu/xnu-1504.3.12/bsd/kern/syscalls.master
    ; 4 AUE_NULL ALL { user_ssize_t write(int fd, user_addr_t cbuf, user_size_t nbyte); }
    push    dword msg.len  ; Last argument is length
    push    dword msg      ; 2nd last is pointer to string
    push    dword 1        ; 1st argument is File descriptor (1=STDOUT)
    mov     eax, 4         ; eax = 4 is write system call
    sub     esp, 4         ; On OS/X 32-bit code always need to allocate 4 bytes on stack
    int     0x80

    ; sys_exit
    ; 1 AUE_EXIT ALL { void exit(int rval); }
    push    dword 42       ; Return value
    mov     eax, 1         ; eax=1 is exit system call
    sub     esp, 4         ; allocate 4 bytes on stack
    int     0x80

section .rodata

msg:    db      "Hello, world!", 10
.len:   equ     $ - msg

组装并链接:

nasm -f macho testexit.asm
ld -macosx_version_min 10.7.0 -o testexit testexit.o
./testexit
echo $?

YASM参数应该与NASM。它应该输出:

Hello, world!
42

32 位 OS/X 代码中系统调用的经验法则:

  • 参数在堆栈上从右向左传递
  • int 0x80 does not需要有一个 16 字节对齐的堆栈
  • 在参数被压入之后、系统调用之前,需要在堆栈上额外分配 4 个字节。例子:

    1. sub esp, 4
    2. push eax
  • 系统调用号在EAX登记

  • 系统调用通过发起int 0x80

Apple 在其文档中记录了 OS/X 系统调用website https://opensource.apple.com/source/xnu/xnu-1504.3.12/bsd/kern/syscalls.master.


64 位 OS/X 代码通过 SYSCALL 指令进行系统调用

64 位 OS/X 几乎使用与 64 位 Linux 相同的内核调用约定。这64 位 Linux 系统 V ABI https://www.uclibc.org/docs/psABI-x86_64.pdf适用于系统调用。特别是该部分A.2 AMD64 Linux 内核约定。该部分有以下规则:

  1. 用户级应用程序用作整数寄存器来传递序列 %rdi、%rsi、%rdx、%rcx、%r8 和 %r9。内核接口使用%rdi, %rsi、%rdx、%r10、%r8 和 %r9。
  2. 系统调用是通过 syscall 指令完成的。内核破坏 寄存器 %rcx 和 %r11。
  3. 系统调用的编号必须在寄存器 %rax 中传递。
  4. 系统调用仅限于六个参数,没有参数直接传递 堆栈。
  5. 从系统调用返回,寄存器 %rax 包含以下结果 系统调用。 -4095 和 -1 之间的值表示错误, 它是-errno。
  6. 仅 INTEGER 类或 MEMORY 类的值会传递到内核。

64 位 OS/X 使用相同的系统调用号码 https://opensource.apple.com/source/xnu/xnu-1504.3.12/bsd/kern/syscalls.master与 32 位 OS/X 一样,但是所有数字都必须添加 0x02000000。上面的代码可以修改为 64 位 OS/X 程序:

global start
section .text

start:
    mov     eax, 0x2000004 ; write system call
    mov     edi, 1         ; stdout = 1
    mov     rsi, msg       ; address of the message to print
    ;lea     rsi, [rel msg]; Alternative way using RIP relative addressing
    mov     edx, msg.len   ; length of message
    syscall                ; Use syscall, NOT int 0x80

    mov     eax, 0x2000001 ; exit system call
    mov     edi, 42        ; return 42 when exiting
    syscall

section .rodata

msg:    db      "Hello, world!", 10
.len:   equ     $ - msg

请注意,写入 32 位寄存器时,CPU 会自动将零扩展到 64 位寄存器。上面的代码通过写入寄存器来使用此功能,例如EAX, EDI代替RAX and RDI。您可以使用 64 位寄存器,但使用 32 位寄存器可以在代码中节省一个字节。

组装并链接:

nasm -f macho64 testexit64.asm
ld -macosx_version_min 10.7.0 -lSystem -o testexit64 testexit64.o
./testexit64 
echo $?

它应该输出:

Hello, world!
42

Note:其中一些信息本质上与此类似OS/X 教程 https://filippo.io/making-system-calls-from-assembly-in-mac-os-x/修复了一些更正和编码错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ld 链接器错误 - 架构 x86_64 的未定义符号 的相关文章

  • 文件从 iOS 应用程序传输到 Mac 应用程序?

    是否可以在 Mac 应用程序和 iOS 应用程序之间传输文件 我想通过 Wifi 将 iOS 应用程序中的文档目录中的文件传输到 Mac 应用程序 我该怎么做 嗯 从 iOS 5 开始 就有了 iCloud 由于这仍处于保密协议之下 我只需
  • Google Chrome 开发工具自动打开“抽屉”窗格

    截至几天前 每当我在 OSX 上的 Chrome 中打开开发人员工具时 抽屉 都会自动打开 第二个屏幕截图 蓝色图标显示 隐藏抽屉 现在默认为打开 第一个屏幕截图 这太烦人了 我想不出办法来阻止这种行为 以前从来没有这样做过 这让我很烦恼
  • 如何在 Safari 10 中查看 cookie?

    这些是我尝试过的方法 在 Safari 10 中查看 HTTP 标头 https stackoverflow com questions 39760367 view http headers in safari 10 但 cookie 没有
  • ld 链接器错误 - 架构 x86_64 的未定义符号

    我正在尝试链接一个单模块汇编语言程序yasm我收到以下错误ld Undefined symbols for architecture x86 64 start referenced from implicit entry start for
  • 计算字符数组中的字符频率 - x86 Assembly

    我正在尝试计算字符串中字符的出现次数 我的代码如下 data segment DSEG text db This is a sentence 0 string textSize dw text 1 size of string 1 to a
  • 计算字符数组中的字符频率 - x86 Assembly

    我正在尝试计算字符串中字符的出现次数 我的代码如下 data segment DSEG text db This is a sentence 0 string textSize dw text 1 size of string 1 to a
  • 让 g++ 使用 SHLD/SHRD 指令

    考虑以下代码 include
  • DLL 和完全专用的模板类

    环境 Visual Studio 9 C 无托管扩展 我有一个第三方库 它导出完全专业的模板类MyClass lt 42 gt 在 MyClass h 中定义 它被编译成辅助加载器 lib 和 dll 文件 lib 文件包含此专业化的编译代
  • 升级到Lion,无法构建gem本机扩展

    不确定我的问题是否与此线程有关 http stackoverflow com questions 6589066 rmagick and os x lion 但我刚刚升级到 Lion 更具体地说 我购买了一台新机器并迁移了我的旧配置文件 我
  • 如何在Mac上更改Docker镜像的安装目录?

    Docker 镜像存储在 HOME Library Containers com docker docker Data但如何将这些大文件移动到外部驱动器呢 我尝试过符号链接 但没有用 我也找不到 g选项docker如上所述here http
  • Ansible 上的“ansible_architecture”和“ansible_machine”有什么区别?

    我试图通过使用来找到机器的架构Ansible 事实 https docs ansible com ansible latest user guide playbooks vars facts html ansible facts 我们可以通
  • Xcode 5 应用程序提交问题

    几天前我安装了 Xcode 5 今天我尝试提交一个应用程序 但在验证过程中我遇到了这个问题 网络连接丢失 我在使用 Xcode 4 时从来没有遇到过任何问题 我的网络没问题 没有使用任何代理 是什么导致了这个问题 这可能是一个巧合 但就像最
  • 嵌入了 iOS 项目的 OSX 项目 - 找不到 UIKit.h [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有一个 OSX 项目和一个 iOS 子项目 子项目使用 UIKit h 但即使子项目已将 UIKit 框架添加到 链接二进制文件与库 部
  • Lion 更新删除了“postgres”用户。如何恢复呢?

    几个月前我用 kyngchaos 安装程序安装了 postgres 我现在已更新到 OSX Lion 但数据库服务器无法启动 kyngchaos 博客上的评论 http www kyngchaos com blog 2011 2011072
  • 从 Mac 应用程序启动 Safari

    如何启动 Safari 浏览器或用户的默认浏览器 将其指向 Mac 应用程序中的特定地址 我使用 Objective C 作为编程语言 Thanks 从 shell 中您可以使用open命令以 URL 作为参数 并且负责在默认浏览器中打开该
  • 在 MacOS 命令行上使用 Android Studio 内置 Java

    这里有很多关于在 Mac 上安装 Java 以及让 Android Studio 使用正确版本的信息 很多已经过时 但是最近版本的 Android Studio 2 2 及更高版本 提供了自己的 Java 对于大多数 Mac 用户来说 没有
  • 汇编语言:cbw

    我不确定是什么cbw命令确实如此 我有一段代码 mov ax 0FF0h cbw idiv ah cbw后ax的值如何变化 The cbw指令将一个字节符号扩展为一个字 在这种情况下 它将采用符号位AL 恰好是1 并将其复制到每一位AH 这
  • ASM 16Bit 将输入缓冲区字符串转换为数字

    也许有人可以帮助我 我正在尝试打印 用户输入的数量 所以我需要将字符串转换为数字 我正在尝试循环执行此操作 但遇到一些问题 我的代码无法正常工作 它正在打印 65535 基本上这是最大值 也许有人可以解释我的问题出在哪里 MODEL sma
  • 嵌入式Python,导入数学错误

    首先我使用的是 Mac OSX 10 12 6 我想在我的 C 应用程序中嵌入 python 环境 我把 github python 项目放在https github com python cpython https github com
  • Lightgbm OSError,库未加载

    如果我简单地这样做 import lightgbm as lgb 我越来越 python script py Traceback most recent call last File script py line 4 in

随机推荐

  • oracle数据库中存储经纬度的数据类型

    我想在oracle db中存储纬度和经度 哪种数据类型适合用于这两个字段 我真的很感谢你的回复 latitude 48 858844300000001 longitude 2 2943506 每列将是NUMBER x 3 x 其中 x 是您
  • 无法向电子邮件发送消息

    我在服务器上发送消息时遇到问题 但在我本地 我可以使用免费的 smtp 服务器向电子邮件发送消息 也许存在防火墙或电子邮件策略不接受本地主机 请指教 谢谢 Code send email MailMessage objEmail new M
  • 无法向电子邮件发送消息

    我在服务器上发送消息时遇到问题 但在我本地 我可以使用免费的 smtp 服务器向电子邮件发送消息 也许存在防火墙或电子邮件策略不接受本地主机 请指教 谢谢 Code send email MailMessage objEmail new M
  • 我想根据值/高度为条形图着色

    我正在尝试制作根据其值具有颜色的条形图 我可以将条形图和热图分开 但不能放在一起 以下是我尝试组合的命令 N X 1 10 1 h bar N hist cData get h CData h CData n rbg set h CData
  • 我想根据值/高度为条形图着色

    我正在尝试制作根据其值具有颜色的条形图 我可以将条形图和热图分开 但不能放在一起 以下是我尝试组合的命令 N X 1 10 1 h bar N hist cData get h CData h CData n rbg set h CData
  • 如何保存和加载xgboost模型? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 来自XGBoost 指南 https xgboost readthedocs io en latest python python i
  • 如何保存和加载xgboost模型? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 来自XGBoost 指南 https xgboost readthedocs io en latest python python i
  • 标准库字符串新放置中的内存泄漏

    我在标准库字符串的新放置中面临内存泄漏 下面我给出了显示泄漏的代码 string string1 new string char string sizeof string new string string string1 使用dbx发现泄
  • 标准库字符串新放置中的内存泄漏

    我在标准库字符串的新放置中面临内存泄漏 下面我给出了显示泄漏的代码 string string1 new string char string sizeof string new string string string1 使用dbx发现泄
  • 使用 PayPal 的多商户支付系统

    我需要构建用户可以在其中销售商品的网络应用程序 每个用户都应该能够直接从他的 PayPal 帐户上获得资金 您能否建议在这种情况下使用哪种 PayPal 服务 支付方式 或其他支付系统 更好 更安全 提前致谢 这很容易设置 如果我正确阅读了
  • 免费密码学库

    最稳定和最有用的密码学库是什么 它们是 使用 针对 python c c net 编写 开源 GNU 或其他免费许可证 标准 Python 库 实现 AES 和 RSA 等常见密码 是PyCrypto http www dlitz net
  • 使用 PayPal 的多商户支付系统

    我需要构建用户可以在其中销售商品的网络应用程序 每个用户都应该能够直接从他的 PayPal 帐户上获得资金 您能否建议在这种情况下使用哪种 PayPal 服务 支付方式 或其他支付系统 更好 更安全 提前致谢 这很容易设置 如果我正确阅读了
  • 如何在 IntelliJ 中运行单个量角器测试?

    我开发了一个 Angular 应用程序并使用 Protractor 进行 e2e 测试 在 Intellij 终极版 中 我为我的测试创建了运行 调试配置 如果我想运行所有测试 这很好用 但是我如何才能只运行单个规范文件或单个测试用例呢 我
  • GC.start 在 Pry 中无效,但在 IRB 中有效

    我在 Pry 中玩垃圾收集 并注意到由于某种原因它似乎不起作用 我正在尝试不同的方法将我的大数组设置为nil等等 同时让我陷入这样的问题 为什么我根本无法用GC start 然后我去了IRB 突然就有效了 我想知道是什么导致了这种情况 如果
  • DataContractSerializer - 如何将 xml 输出到字符串(而不是文件)

    我有一个关于 datacontractserializer 的快速问题 也许这更像是一个流问题 我找到了一段将 xml 写入文件流的代码 我基本上不需要该文件 只需要字符串输出 public static string DataContra
  • 模型字段的外键?

    我想要一个foreign key我的模型与的关系username领域中的User表 存储user创建于django contrib auth forms UserCreationForm 这是我的模型的样子 class Blog model
  • 打开我的 Cloud Run 服务的 URL 时出现 403“错误:禁止”

    我构建了容器映像 然后使用 Cloud Console 部署到 Cloud Run 但是 当我打开服务的端点 URL 时 我得到一个403 Error Forbidden page 如果您在访问 Cloud Run 服务时收到 403 Er
  • MS Access 获取 ISO 标准周数

    令我惊讶的是 我在网上找不到任何现有的解决方案 但我只需要一个返回 ISO 标准周数的 SQL 函数 即第一周的开始始终是一年中的第一个星期一 所有 DatePart 函数选项都不会始终返回正确的结果 我曾想过选项 vbFirstFourD
  • 如何在 Matlab 中标记两个向量?

    我有一个 2 列矩阵 称为M 我使用 Matlab 将其可视化为两个向量plot命令 plot M 我有两个问题 我想在绘图上标记向量本身 我想在绘图上标记矩阵的每一行 即每个向量分量 我该如何去做这些事情呢 一个例子 M cumsum r
  • ld 链接器错误 - 架构 x86_64 的未定义符号

    我正在尝试链接一个单模块汇编语言程序yasm我收到以下错误ld Undefined symbols for architecture x86 64 start referenced from implicit entry start for