1

我正在尝试使用 gcc 创建一个可执行文件。我有两个文件 virtualstack.c(它由下面的 C 代码组成)和 stack.s,它由用 AT&T 语法编写的 intel x86 汇编代码组成(见下面的 C 代码)。我的命令行命令是gcc -c virtualstack.c -s stack.s,但出现两个错误(stack.s 中的第 3 行)-missing symbol name in directiveno such instruction _stack_create. 我以为我已经在程序集中正确声明了 C 中的函数,前缀为下划线 ( _)。我将非常感谢任何评论。

C代码:

#include <stdio.h>
#include <stdlib.h>

extern void stack_create(void);

int main(void)
{
stack_create();

return 0;
}

汇编代码:

.global _stack_create
    .type, @function

_stack_create
pushl   %ebp
movl    $5, %esp
movl    %esp, ebp
movl    $21, %edx
pushl   %edx
4

1 回答 1

2

我将尝试向您解释如何调查此类案件的方法。

1)让编译器为你工作总是个好主意。所以让我们从代码开始(我们称之为 assemble.c):

    #include <stdio.h>
    #include <stdlib.h>

    /* stub stuff */
    void __attribute__ ((noinline))
    stack_create(void) { }

    int
    main(void)
    {
      stack_create();
      return 0;
    }

现在用gcc -S -g0 assemble.c. stack_create 函数被组装成(你的结果可能会有所不同,所以请自行按照我的说明进行操作):

  .text
  .globl  stack_create
  .type stack_create, @function
stack_create:
  pushq %rbp
  movq  %rsp, %rbp
  popq  %rbp
  ret
  .size stack_create, .-stack_create

2) 现在你只需要使用这个模板并用你的东西填充它:

  .text
  .globl  stack_create
  .type stack_create, @function
stack_create:
  pushq %rbp
  movq  %rsp, %rbp

  ;; Go and put your favorite stuff here!
  pushl   %ebp
  movl    $5, %esp
  movl    %esp, ebp
  movl    $21, %edx
  pushl   %edx
  ... etc ...

  popq  %rbp
  ret
  .size stack_create, .-stack_create

当然,让它成为单独的.s文件,比如 stack.s。

3) 现在让我们一起编译。从 assemble.c 中删除存根内容并将所有内容编译为:

gcc assemble.c stack.s

我没有错误。我相信你也不会出错。

主要教训:永远不要尝试在汇编器中编写诸如节、函数标签等细节。编译器更好地知道如何去做。用他的知识代替。

于 2013-02-10T12:55:55.420 回答