首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gcc版>= 4.9.0对gcc版< 4.9?

gcc版>= 4.9.0对gcc版< 4.9?
EN

Stack Overflow用户
提问于 2016-12-23 13:47:15
回答 1查看 177关注 0票数 2

最近,我利用了一个危险的程序,发现了x86-64体系结构上gcc版本之间的不同之处。

Note

  1. 错误地使用gets而不是的问题。
  2. 如果我们用任何其他函数替换gets,那么问题就不会改变。

这是我使用的源代码:

代码语言:javascript
复制
#include <stdio.h>
int main()
{
    char buf[16];
    gets(buf);
    return 0;
}

我使用gcc.godbolt.org来反汇编带有标志-m32 -fno-stack-protector -z execstack -g的程序。

在反汇编代码中,当gcc具有>= 4.9.0版本时

代码语言:javascript
复制
lea     ecx, [esp+4]            # begin of main
and     esp, -16
push    DWORD PTR [ecx-4]       # push esp
push    ebp
mov     ebp, esp
/* between these comment is not related to the question
push    ecx
sub     esp, 20
sub     esp, 12
lea     eax, [ebp-24]
push    eax
call    gets
add     esp, 16
mov     eax, 0
*/
mov     ebp, esp            
mov     ecx, DWORD PTR [ebp-4]  # ecx = saved esp
leave
lea     esp, [ecx-4]
ret                             # end of main

但是gcc的版本< 4.9.0只是:

代码语言:javascript
复制
push    ebp                     # begin of main
mov     ebp, esp
/* between these comment is not related to the question
and     esp, -16
sub     esp, 32
lea     eax, [esp+16]
mov     DWORD PTR [esp], eax
call    gets
mov     eax, 0
*/
leave
ret                             # end of main

,我的问题是:,在反汇编的代码上产生这种差异的原因是什么及其好处?它有这个技术的名字吗?

EN

回答 1

Stack Overflow用户

发布于 2016-12-23 16:40:59

如果没有实际值,我就不能肯定地说:

代码语言:javascript
复制
and     esp, 0xXX               # XX is a number

但是,这看起来很像额外的代码,用于将堆栈对齐到比ABI所要求的更大的值。

编辑:值为- 16,这是32位0xFFFFFFF0或64位0xFFFFFFFFFFFFFFF0,因此这确实是堆栈对齐16字节,可能意味着使用SSE指令。正如注释中提到的,在>= 4.9.0版本中有更多的代码,因为它还对框架指针,而不仅仅是堆栈指针。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41302625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档