如何查看可执行文件中的宏定义值

时间:2018-02-12 20:46:12

标签: c++ c

自从我用C / C ++编写代码以来已经好几年了,对于newbie'ish问题感到遗憾。我的代码库根据通过#defines定义的配置进行不同的编译,这些配置可以作为args提供给makefile。有没有办法对这些#defines进行编码,这样我就可以查看一个可执行文件并查看定义是什么 - 例如。

int main() {
  #ifdef CONFIG_A
    init_config_a();
  #endif
  #ifdef CONFIG_B
    init_config_b();
  #endif
}

#ifdef CONFIG_A
void init_config_a() {
  // do something
}
#endif

#ifdef CONFIG_B
void init_config_b() {
  // do something for B
}
#endif

如何判断给定的可执行文件是使用config A还是config B创建的。一个hack是查找仅根据定义编译的符号(例如init_config_a),但这非常难看。

编辑:对不起,我忽略了一个重要的信息:该程序实际编译为在嵌入式系统上运行,所以我不能轻易添加一个开关或其他机制来在本地运行该程序。

2 个答案:

答案 0 :(得分:0)

嗯,你的问题并不是真正想要在你拥有二进制文件后如何获得信息。由于不涉及反汇编的解决方案将具有包含该信息的结构,并在您想要打印该信息时对其进行初始化。或许像这样微不足道的东西:

#include <stdio.h>
#include <string.h>

struct buildinfo {
    int CONFIG_A;
    int CONFIG_B;
};

void get_build_info(struct buildinfo *info)
{
    if(info == NULL)
        return;

    memset(info, 0, sizeof *info);

#ifdef CONFIG_A
    info->CONFIG_A = 1;
#endif

#ifdef CONFIG_B
    info->CONFIG_B = 1;
#endif

}

int main(int argc, char **argv)
{

    if(argc == 2 && strcmp(argv[1], "-v") == 0)
    {
        struct buildinfo info;
        get_build_info(&info);
        printf("build info: CONFIG_A: %s, CONFIG_B: %s\n",
                info->CONFIG_A ? "yes" : "no",
                info->CONFIG_B ? "yes" ; "no");

        return 0;
    }


    ...


    return 0;
}

我不想分析二进制文件,然后您可以执行./yourprogram -v并查看屏幕上显示的信息。

答案 1 :(得分:0)

  1. 最好的方法是根据使用的定义命名二进制文件。
  2. 如果您想通过检查来判断二进制文件是使用CONFIG_A还是CONFIG_B构建的。可能的方法可能如下。 根据特定地址的配置放置签名(也可以在任何地址工作)。 e.g。

    int main() {
    #ifdef CONFIG_A
    // this sign can be put at specific address with #pragma
    const char sign[]="CONFIG_A";
    init_config_a();
    #elif defined(CONFIG_B)   // only one shall be defined at a time 
    // this sign can be put at specific address with #pragma
    const char sign[]="CONFIG_B";
    init_config_b();
    #endif
    }
    
  3. 在文本编辑器中打开二进制文件时,您将能够看到ASCII视图中的符号。