【发布时间】:2013-02-10 11:23:52
【问题描述】:
我正在尝试使用 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 directive 和no such instruction _stack_create。我以为我已经在程序集中正确声明了 C 中的函数,前缀为下划线 (_)。我会非常感谢任何 cmets。
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
【问题讨论】:
-
第二个
_stack_create后面需要一个冒号。而且我不知道.type的行是否正确,但这不是必需的。顺便说一句,将 5 移动到esp是自找麻烦。 -
@alexey frunze。谢谢:) 现在我对结肠感到愚蠢。我应该看到那个。没有 .type 它编译。我仍然需要看看它是否可执行。也感谢 esp 警告。
-
好吧。我已经删除了 .type、@function。我发现 gcc 创建了单独的对象文件。我尝试改写 gcc -o vs virtualstack.c -s stack.s 。我认为应该创建一个 vs.out 文件(可执行文件)。然后我在 main() 中得到了对 stack_create 的未定义引用 - 知道为什么吗?
-
-s是干什么用的?没有它应该可以工作。 -
您的汇编代码完全错误。它会破坏堆栈指针(通过将 5 写入其中),如果
pushl %edx本身不会导致异常(因为通常,地址 0 周围的内存不可访问)然后它会导致 CPU 执行 @987654332 后面的任何垃圾@在内存中。
标签: gcc assembly compilation x86