出于某些目的,我必须使用gcc。目标是能够跟踪特定编译期间调用的GCC函数。不幸的是,我并不熟悉GCC的架构,所以我需要一些帮助。我尝试了以下步骤:
1)黑客攻击gcc / Makefile.in并在T_CFLAGS中添加“-finstrument-functions”标志。
2)我已经实现并测试了 start_test 和 end_test 功能。在toplev_main()调用之前和之后,从gcc / main.c调用它们。包含文件链接到gcc(该对象被添加到OBJS-common中,并且依赖关系稍后在gcc / Makefile.in中定义)
3)使用contrib / download_prerequisites下载先决条件
4)从干净的构建目录(与源目录处于同一级别)执行配置:./../gcc-4.6.2/configure --prefix="/opt/gcc-4.6.2/" --enable-languages="c,c++"
5)用“make all”开始构建
这样我跑出了记忆,虽然我有28G
接下来,我尝试从Makefile中删除T_CFLAGS设置,并将-finstrument-functions命令给make命令:make CFLAGS="-finstrument-functions"
。这种构建方式是成功的,但是当我尝试编译某些东西时,它会产生空输出文件。 (理论上 end_test 应该将其结果写入给定文件。)
我做错了什么? 提前谢谢!
答案 0 :(得分:1)
除非您明确地将其排除在检测范围之外,否则main
本身需要使用检测功能,因此请拨打start_test
和end_test
内的电话 {{1不是你想要的方式。确保文件在正确的时间打开和关闭的“正确”方法是定义“构造函数”和“析构函数”,GCC会在main
之前和之后自动生成对它们的调用:
main
脚注:
void start_test (void)
__attribute__ ( (no_instrument_function, constructor));
void end_test (void)
__attribute__ ( (no_instrument_function, destructor));
/* FILE to write profiling information. */
static FILE *profiler_out;
void start_test (void)
{
profiler_out = fopen ("profiler.out", "w");
if (profiler_out == NULL)
exit (-1);
}
void end_test (void)
{
fclose (profiler_out);
}
,constructor
和destructor
属性here。它们是GCC理解的功能属性。