自从我用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),但这非常难看。
编辑:对不起,我忽略了一个重要的信息:该程序实际编译为在嵌入式系统上运行,所以我不能轻易添加一个开关或其他机制来在本地运行该程序。答案 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)
如果您想通过检查来判断二进制文件是使用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
}
在文本编辑器中打开二进制文件时,您将能够看到ASCII视图中的符号。