【问题标题】:How to list external identifiers in gcc?如何在 gcc 中列出外部标识符?
【发布时间】:2015-10-21 19:15:09
【问题描述】:

我在 C 项目中有一个模块,其中包含大量源文件和头文件。它们包括许多外部头文件,来自同一项目的 libc 和其他模块。我想收集这些外部头文件中实际使用的标识符列表。不仅仅是符号,还有所有外部类型定义、内联函数、宏等。

我想编译一个列表来查看该模块具有哪些外部依赖项,因此如果我想将该模块移动到一个完全不同的项目中,我可以看到究竟需要移植/重写/丢弃什么。在这种特殊情况下,我对 libc 依赖项不感兴趣,而是对来自同一项目的其他模块的依赖项感兴趣。

我最接近的方法是暂时删除包含指令,如下所示:

sed -i s/"#include <.*>"//g *.c
sed -i s/"#include <.*>"//g *.h

然后用 -Wno-unused 编译文件,这样我就可以看到由于缺少标题而导致的错误消息。但它仍然远非一个易于阅读的外部标识符列表。

【问题讨论】:

  • 你为什么这么关心使用过的标识符?您提出问题的确切动机是什么?请编辑您的问题以改进它!
  • 即使进行了编辑,我仍然不明白您的动机。一旦您使用任何外部库,您很可能不会使用其中的所有名称...
  • 没错,我并没有使用来自外部库的所有标识符,我只是想知道从这些外部来源中究竟使用了什么。因为它仍然是相当大的一段代码,其中有很多对外部代码的引用,而不是逐行遍历它并收集使用的类型/函数/宏的列表,我想要一些更自动化的东西。这将帮助我计划和准备交换到另一个外部库,该库(据我现在所见)具有此代码现在使用的内容。

标签: c gcc identifier


【解决方案1】:

它实际上比你想象的要难(特别是因为 preprocessorconcatenation 这样的技巧可以构建符号,还因为一些编译器特定的头文件 - 特别是 &lt;stdarg.h&gt; - 可能依赖于 GCC 内置或扩展,也GCC 接受asm labels 等)。

还请注意,编译器可能会执行 optimizations 之类的操作,例如将简单的 printf 转换为 puts(在这种情况下,什么名称算数?)...

如果你真的是你想要的,你可以自定义GCC,例如使用MELT,以满足您的目的。这可能需要数周的时间。

另一种方法可能是大致解析预处理的表单,收集其中的词汇标记,并对它们进行排序。您可以flex 生成词法分析器,并用 C++(或 Python,或 Ocaml)或其他方式编写您的实用程序;但它只会产生所用名称的近似值...如果您想解析 C++ 代码,则要困难得多(命名空间、模板、name mangling...)。

如果您将自己限制为链接器可见符号,您当然可以在目标文件和未剥离的可执行文件上使用 nm(1)

顺便说一句,GCC 可以处理 -M preprocessor options 以自动生成 make 依赖项。

最后,我无法理解您的动机(即使您最新的编辑):如果您在某些 GUI 应用程序中有 #include &lt;gtk/gtk.h&gt;,您很可能不会使用 GTK 中定义的每个符号或标识符......(同样,您可能不会使用来自&lt;stdio.h&gt;&lt;unistd.h&gt;...的每个标识符。)在实践中,您很可能不会使用所有您正在使用的大多数外部库(GTK、sqlite、libcurl、...)提供的符号

也许像cxref 这样的cross-referencing 工具可能有用。

【讨论】:

  • 是的,串联确实会让这变得更难。幸运的是,这个特定代码中没有 asm 标签,而且我对 gcc 内置扩展不感兴趣。对于像 printf -> puts change 这样的优化,我关心原始标识符。但正如我在原始问题中更新的那样,在这种特殊情况下,libc 依赖项对我来说并不那么有趣。
  • 我也试过 nm,但实际上大部分函数都被内联了。而且它不显示宏、类型定义。
  • -M gcc 选项也几乎是我想要的:它可以给我一个头文件列表,但不能给我使用的头文件。
  • 重新调整您的 GTK 示例的用途:是的,很可能我的模块远没有使用 GTK 中的每个标识符,这就是为什么我想要一份来自 GTK 的确切列表。因此,如果我想用其他东西替换 GTK,我可以看到我需要注意什么。
  • 但是你为什么要这个。一旦您使用 GTK,您将#include &lt;gtk/gtk.h&gt; 并与$(pkg-config --libs gtk+-x11-3.0) 链接,所以我不明白您的意思。如果你用其他东西(不兼容)替换 GTK,如果缺少某些东西,编译或构建将失败
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-01
  • 1970-01-01
  • 2014-12-10
相关资源
最近更新 更多