![为什么我不能链接这个简单的汇编语言目标文件?](https://linux22.com/image/864005/%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E4%B8%8D%E8%83%BD%E9%93%BE%E6%8E%A5%E8%BF%99%E4%B8%AA%E7%AE%80%E5%8D%95%E7%9A%84%E6%B1%87%E7%BC%96%E8%AF%AD%E8%A8%80%E7%9B%AE%E6%A0%87%E6%96%87%E4%BB%B6%EF%BC%9F.png)
我正在使用 Ubuntu 14.04 和终端。
我正在为一个班级做汇编语言练习。我想尝试在终端中运行它,但我无法链接此文件。[我认为“链接”是使用该命令的正确术语,gcc -o ex71 ex71.s
但我对汇编语言和 GNU/Linux 不熟悉,所以我可能弄错了]。下面是我的 .s 文件。
我首先as -gstabs -o ex71.o ex71.s
在终端中输入内容,这也是我的教科书所做的[创建一个目标文件对吧?]。然后我输入命令gcc -o ex71 ex71.s
。然后我会输入,./ex71
但是我收到一个很长的错误信息,gcc -o ex71 ex71.s
告诉我relocation ## has invalid symbol index ##
。在错误的最后,它显示undefined reference to 'main'
。
输出错误消息的示例展示了其形式:
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 0 has invalid symbol index 11
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 1 has invalid symbol index 12
源代码:
# ex71.s
# Minimum components of a C program, in assembly language
# Copied from Bob Plantz
#
# comment lines placed to correspond with textbook
.text
.globl f
.type f, @function
f:
pushq %rbp # save caller's frame pointer
movq %rsp, %rbp # establish our frame pointer
movl $0, %eax # return 0 to caller
movq %rbp, %rsp # restore stack pointer
popq %rbp # restore caller's frame pointer
ret # back to caller
答案1
您已经有了目标文件(生成,正如您正确推测的那样,使用as -gstabs -o ex71.o ex71.s
),因此要链接它,您应该使用:
gcc -o ex71 ex71.o
例如,参见这个问题。
undefined reference to main
GCC 的 是因为当被告知创建可执行文件时,它需要一个函数main
。据我所知(我可能错了,我从未做过汇编语言编程),您需要一个_start
函数(在这种情况下,您将使用ld
)或一个main
函数(在这种情况下,您将使用 GCC)。因此,将其替换f
为_start
并执行:
ld -o ex71 ex71.o
或者替换f
为main
并执行:
gcc -o ex71 ex71.o
之后我遇到了段错误,但这取决于你自己的调试。我对此的理解到此结束。:)