2

出于某些目的,我必须对 gcc 进行检测。目标是能够跟踪在特定编译期间调用了哪些 GCC 函数。不幸的是,我对 GCC 的架构并不是很熟悉,所以我需要一点帮助。我尝试了以下步骤:

1) 破解 gcc/Makefile.in 并将“-finstrument-functions”标志添加到 T_CFLAGS。
2) 我有一个已经实现和测试的start_testend_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应该将其结果写入给定文件。)

我做错了什么?提前致谢!

4

1 回答 1

2

除非您明确将其排除在仪器之外,否则它main本身会受到仪器的影响,因此对您的内部start_testend_test 内部 main进行调用并不是您想要的方式。确保文件在正确时间打开和关闭的“正确”方法是定义“构造函数”和“析构函数”,GCC 会在前后自动生成对它们的调用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);
}

脚注:

  1. 在此处阅读更多关于constructor和属性destructor的信息。它们是 GCC 理解的函数属性。no_instrument_function
  2. 在 IBM 网站上阅读此出色的检测指南。
于 2012-06-05T17:52:17.130 回答