-->

提取a.out文件全局变量(Extract global variables from a.out

2019-06-25 10:44发布

编辑(更新问题)

我有一个简单的C程序:

   // it is not important to know what the code does you may skip the code 

main.c中

#include <bsp.h>

unsigned int   AppCtr;
unsigned char  AppFlag;
int SOME_LARGE_VARIABLE;

static  void  AppTest (void);

void  main (void)
{
    AppCtr  = 0;
    AppFlag = 0;        
    AppTest();
}

static void Foo(void){
    SOME_LARGE_VARIABLE=15; 
}


static  void  AppTest (void)
{
    unsigned int  i;
    i = 0;
    while (i < 200000) {
        i++;
    }

    BSP_Test();      
    SOME_LARGE_VARIABLE=3;    
    Foo();
}

bsp.c

extern int SOME_LARGE_VARIABLE;
extern unsigned char  AppFlag;

unsigned int long My_GREAT_COUNTER;

void  BSP_Test (void) {
  SOME_LARGE_VARIABLE = 5;
  My_GREAT_COUNTER = 4;
}

(该程序不会做任何有用的...... 我的目标是提取变量名的位置,在那里他们被宣布和他们的内存地址

当我编译程序我得到的文件a.out这是一个包含调试信息的ELF文件。

该公司有人写在.NET程序5年前,将获得从a.out文件所有这些信息。 这是代码返回了什么:

   //  Name          Display Name                    Type      Size     Address

对于这个小程序它的伟大工程,也为其他大型项目。

这代码是2000线长着几个错误,它不支持.NET版本4,这就是为什么我试图重新创建它。


所以我的问题是 ,我在我不知道该采取以解决这个问题的办法是什么感觉丧失。 这是我一直在考虑的选项:

  1. 组织程序我发现在第一图像上的缺陷代码,并尝试看看它做什么,以及它如何解析a.out文件,以获得该信息。 有一次,我完全理解揣摩为什么它不支持版本3和4。

  2. 我行创造正则表达式,所以也许尝试做这样的事情来寻找a.out文件的模式: 到目前为止,我能找到那里是只有一个文件(main.c中)的模式。 但是,当有几个文件,它获得的更加复杂。 我还没有尝试过呢。 也许这将是并不复杂,这将是可能找到的格局。

  3. 安装Cygwin的 ,这样我可以在诸如窗户使用Linux命令objdumpnmelfread 。 我have't与命令演够当我使用这些命令,如readelf -w a.out我收获更多的信息,我需要。 也有一些缺点,为什么我没有花太多时间使用这种方法:

    • 缺点:这需要一段时间才能在Windows上,给这个应用给我们的客户的时候,我们不希望他们必须安装它安装cygwin。 也许有刚刚安装的方式objdump的命令和elfread无需安装整个事情

    • 优点:如果我们找到合适的命令来使用,我们不会重新发明轮子和节省一些时间。 也许这是解析命令的结果的问题,如objdump -w a.out


如果你要下载的a.out文件,以分析它在这儿呢 。


摘要

我将能够得到a.out文件的全局变量。 我会想知道每一个变量是什么类型(INT,CHAR,..),他们有什么内存地址,我也想知道的变量在声明什么文件(main.c中或someOtherFile.c)。 如果我没有用cygwin因为这将使其更易于部署我会很高兴。 由于这个问题问了很多,我试图将其拆分成多个:

  • objdump的/ readelf获取变量的信息
  • 获取a.out文件的符号位置

也许我应该删除了其他问题。 遗憾是多余的。

Answer 1:

这里是我会做什么。 为什么要推倒重来!

  1. 下载将在Windows上需要从Linux命令在这里。

    在bin目录应该有: readelf.exe

    请注意,我们并不需要Cygwin的左右部署将是简单的任何程序!

  2. 一旦我们有了这个文件在cmd中执行:

     // cd "path where readelf.exe is" readelf.exe -s a.out 

    这是会出来的列表:

    所以,如果你看一看我们感兴趣的是让所有那些类型的对象与尺寸大于0的变量。

  3. 一旦我们得到了两个变量,我们可以使用readelf.exe -w a.out命令来看看这棵树,它看起来像: 让我们开始寻找,我们在第2步(SOME_GREAT_COUNTER)中发现的变量需要注意的是在顶部我们知道该变量所声明的位置之一,我们得到了更多的信息,比如它被宣布为线及存储器地址

  4. 我们缺少做的最后一件事情是要获得类型。 如果你看看我们看到的类型是= <0x522>。 这也就意味着,我们必须去到树522,可获取有关时间的详细信息。 如果我们去的那部分这就是我们得到: 从看树,我们知道SOME_LARGE_VARIABLE是unsigned long类型



文章来源: Extract global variables from a.out file