为什么我不能链接这个简单的汇编语言目标文件?

为什么我不能链接这个简单的汇编语言目标文件?

我正在使用 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 mainGCC 的 是因为当被告知创建可执行文件时,它需要一个函数main。据我所知(我可能错了,我从未做过汇编语言编程),您需要一个_start函数(在这种情况下,您将使用ld)或一个main函数(在这种情况下,您将使用 GCC)。因此,将其替换f_start并执行:

ld -o ex71 ex71.o

或者替换fmain并执行:

gcc -o ex71 ex71.o

之后我遇到了段错误,但这取决于你自己的调试。我对此的理解到此结束。:)

相关内容