编辑(更新问题)
我有一个简单的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,这就是为什么我试图重新创建它。
所以我的问题是 ,我在我不知道该采取以解决这个问题的办法是什么感觉丧失。 这是我一直在考虑的选项:
组织程序我发现在第一图像上的缺陷代码,并尝试看看它做什么,以及它如何解析a.out文件,以获得该信息。 有一次,我完全理解揣摩为什么它不支持版本3和4。
我行创造正则表达式,所以也许尝试做这样的事情来寻找a.out文件的模式: 到目前为止,我能找到那里是只有一个文件(main.c中)的模式。 但是,当有几个文件,它获得的更加复杂。 我还没有尝试过呢。 也许这将是并不复杂,这将是可能找到的格局。
安装Cygwin的 ,这样我可以在诸如窗户使用Linux命令
objdump
,nm
或elfread
。 我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文件的符号位置
也许我应该删除了其他问题。 遗憾是多余的。