gcc汇编和汇编
问题描述:
我想用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语言中的函数,前缀为下划线(_
)。我会非常感谢任何意见。gcc汇编和汇编
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
答
我将试图解释你的方法如何调查此类案件。
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
我没有错误。我相信你也不会有任何错误。
主要教训:千万不要尝试在汇编程序中编写像段,函数标签等细节。编译器会更好地知道如何去做。改用他的知识。
第二个'_stack_create'后面需要冒号。我不知道'.type'是否正确,但不需要。顺便说一句,把5移到'esp'就是在问问题。 – 2013-02-10 11:31:06
@alexey frunze。谢谢你:)现在我对结肠感到愚蠢。我应该看到那一个。没有.type编译。我仍然需要看看它是否可执行。也感谢esp警告。 – stian 2013-02-10 11:45:02
好。我删除了.type,@function。我发现gcc创建独立的对象文件。我试着写gcc -o vs virtualstack.c -s stack.s。我相信应该创建一个vsout文件(可执行文件)。然后我得到未定义的参考在main()中的stack_create - 有什么想法为什么? – stian 2013-02-10 12:05:05