c - gcc 堆栈优化?

标签 c gcc assembly x86 disassembly

我刚刚用 C 编写了一个代码示例并尝试对其进行反汇编。以下是代码示例。

void start() {
    char phone[100];
    strcmp(phone, "12312312313");

    char name[100];
    strcmp(name, "eQuiNoX");

    char contact[100];
    strcmp(contact, "PM twitter.com/eQuiNoX__");
}

当我反汇编 start 函数时,我得到以下信息:-

08048414 <start>:
 8048414: 55                    push   ebp
 8048415: 89 e5                 mov    ebp,esp
 8048417: 81 ec 58 01 00 00     sub    esp,0x158
 804841d: c9                    leave  
 804841e: c3                    ret   
  1. 我没有启用任何类型的优化。有人可以解释为什么我从 esp 中减去 158 而不是将值压入堆栈并调用 strcmp 方法的汇编代码吗?是因为它不依赖于任何用户输入吗?
  2. 此外,有什么方法可以生成扩展程序集(我不确定这是不是正确的术语,我只是希望看到用于将值压入堆栈并调用strcmp 函数)。我有什么办法可以做到这一点吗?
  3. 这种行为是否特定于处理器架构或 gcc 版本或两者?

最佳答案

首先,strcmp 是一个标准库函数,因此 gcc 可以免费了解其工作原理。事实上,确实如此;它很少会生成库调用。您可以尝试使用 -fno-builtin 来禁用。

其次,您要与单位化值进行比较。这是,我相信未定义的行为。因此编译器可以为所欲为,包括生成随机代码。

您可以尝试使用 -S 选项让 gcc 获得更详细的反汇编(或者更确切地说,缺少汇编);或者,如果您使用 -g(调试)进行编译,objdump -S 将显示源代码以及汇编代码。

这是我使用 gcc -fno-builtin -g -O0 test.c -c 编译然后使用 objdump -S test.o 转储的示例:

test.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <main>:
#include <string.h>

int main() {
   0:   55                      push   %rbp
   1:   48 89 e5                mov    %rsp,%rbp
   4:   48 83 ec 10             sub    $0x10,%rsp
    const char foo[] = "foo";
   8:   8b 05 00 00 00 00       mov    0x0(%rip),%eax        # e <main+0xe>
   e:   89 45 f0                mov    %eax,-0x10(%rbp)
    return strcmp(foo, "bar");
  11:   48 8d 45 f0             lea    -0x10(%rbp),%rax
  15:   be 00 00 00 00          mov    $0x0,%esi
  1a:   48 89 c7                mov    %rax,%rdi
  1d:   e8 00 00 00 00          callq  22 <main+0x22>
}
  22:   c9                      leaveq 
  23:   c3                      retq   

关于c - gcc 堆栈优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4694280/

相关文章:

debugging - 您最喜欢的反调试技巧是什么?

c++ - 堆栈和 vtable [重新] 位置

c - 我的最终功能不会返回

c - 将数字从文件传递到结构中

c - BST 插入操作。如果已经存在重复节点,则不要插入节点

c - 忽略scanf的返回值

c++ - C : Warning about visibility of a struct

assembly - 如何开始为 ARM 处理器编写自己的移动操作系统?

c - 使用 union 和堆进行双关语

c++ - 在 Linux 上使用 GCC 交叉编译适用于 Windows 的 Qt 应用程序