首页 > 解决方案 > 反汇编 C++ 中全局变量的 .rodata 部分(objdump -D)

问题描述

我希望更好地理解与 C++ 相关的汇编指令。我编写了一个简单的 .cc 文件来尝试对其进行逆向工程,但我无法理解发生了什么。最终,我想更深入地了解在全局变量领域中调用 main 之前执行了什么。

y1y2变量是如何初始化的?大会在做什么?

这是代码:

#include <iostream>
#include <array>

struct y {int i; int j;};

const y y1{7,2}, y2{6,4};

int k = 9;

int jy = k;

int main() {}

这是生成的反汇编objdump -D

00000000004007e4 <_ZL2y1>:
  4007e4:   07                      (bad)
  4007e5:   00 00                   add    %al,(%rax)
  4007e7:   00 02                   add    %al,(%rdx)
  4007e9:   00 00                   add    %al,(%rax)
    ...

00000000004007ec <_ZL2y2>:
  4007ec:   06                      (bad)
  4007ed:   00 00                   add    %al,(%rax)
  4007ef:   00 04 00                add    %al,(%rax,%rax,1)
    ...

标签: c++x86-64disassemblyobjdump

解决方案


变量由静态初始化初始化,这意味着在任何代码(必须)执行之前。该实现通过将内存映像存储在已编译的二进制文件中来实现这一点。

查看十六进制值:它们与您在初始化中分配的数字相匹配。这些根本不是指令。add反汇编程序只是出于无知而打印出来的。


推荐阅读