【发布时间】:2016-11-26 03:00:22
【问题描述】:
我正在尝试链接使用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
我实际上是半定期收到此错误的,所以我想这是一个相当普遍的问题,但不知何故,似乎没有人有一个令人满意的答案。在有人说这是之前问题的重复之前,是的,我知道。就像您可以查看巨大的标题相似的问题文本墙并发现这是重复的一样,我也可以。
Compiler Error: Undefined symbols for architecture x86_64
不适用于我的问题。我不是用 C++ 编写代码,并且该问题中给出的解决方案是该语言特有的。
undefined symbol for architecture x86_64 in compiling C program
也不能解决我的问题,因为我不想将多个目标文件链接在一起。
Error Undefined symbols for architecture x86_64:
解决方案与高级语言中的特定框架有关。
Compiler Error: Undefined symbols for architecture x86_64
解决方案涉及修复函数原型。由于显而易见的原因,此处不适用。
...你明白了。我能找到的每一个过去的问题都是通过一些不适用于我的情况的特殊方法来解决的。
请帮我解决这个问题。我厌倦了一次又一次地遇到这个错误,却无能为力,因为它的文档记录太差了。恕我直言,世界迫切需要一个相当于 MS-DOS 错误代码参考手册的 GNU Dev Tools。
其他信息:
操作系统:Mac OS X El Capitain
来源列表:
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
目标文件的Hexdump,显示符号确实是_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
【问题讨论】:
-
您没有展示如何在 OS/X 上组装和链接您的程序,但我可以告诉您,您的代码
int 0x80似乎是 32 位 Linux ABI 调用约定,即使这组装和链接它不会按预期运行。 32 位 OS/X 将参数传递给堆栈上的int 0x80,而不是寄存器(尽管 EAX 将包含系统调用) -
好的,所以它在不同的操作系统上是不同的。我正在使用一本关于 Linux 的英特尔汇编编程的书,但我认为该代码也适用于 MacOS,因为它们都使用 x86-64 架构并且符合 POSIX。
-
底层系统调用约定在大多数操作系统之间是不同的。同一操作系统上的 i386 和 x86-64 之间的约定也可能不同。 POSIX 没有定义用于调用内核的底层方法,这是一个实现细节。
-
我会看看那个链接。谢谢。
-
本网站的全部目的是消除 XKCD 现象。这是创建 Stack Overflow 的主要理由。所以使用引用实际上并没有完成任何事情。另外,正如罗斯所提到的,我们不需要为每个问题提供一个大背景故事,因为我们更像是一本百科全书,而不是一个传统的论坛。人们来这里是为了获得答案,而不是阅读这些答案背后的用户。此外,罗斯不是主持人。他只是一名普通的社区成员(尽管他已经存在一段时间并提供了很多有用的答案)帮助保持网站的清洁。
标签: macos assembly linker x86 x86-64