3

我有一个 C 代码库,需要以编程方式识别所有使用的全局变量。我认为 gcc 可以用来生成内存映射文件,但不知道如何,这可能让我看到哪些变量是全局的?任何帮助,将不胜感激。

干杯

4

5 回答 5

6

您可以使用nm.

nm *.o | grep OBJT | grep GLOB

上面的EDIT 命令适用于 Solaris 的 nm(SUNWbtool 软件包)。为了便携性,nm有一个参数来选择输出格式:

nm -f [posix|bsd|sysv] *.o
于 2009-01-12T10:32:17.157 回答
1

输出内存映射的选项是带有链接器的 -M,因此要从 gcc 获取它,您必须使用gcc .... -Xlinker -M.

获得这些的另一种方法是使用该ctags程序。它不仅可以标记可用的函数,还可以标记可用的全局变量(并且不收集静态数据,这与内存映射不同)。因为它不能编译所有东西,所以它也应该比 gcc 方法更快(如果你必须编译,你当然可以免费获得)。

于 2009-01-12T10:18:42.613 回答
0

为什么你需要知道这个?出于很多目的,静态数据(无论是在文件范围内还是在函数范围内)都应该与全局变量一起分组。

通常,全局变量确实显示为数据,而不是链接器映射中的代码。堆栈变量和堆分配变量没有。(当然,指向堆分配数据的指针可以是全局的;这只是 C 中指针和它所指向的内容之间的常规区别。)

于 2009-01-12T10:05:12.937 回答
0

如果您有dwarfdump并且您的二进制文件包含 DWARF 调试信息(未剥离),您可以通过运行检查.debug_pubnamesDWARF 部分的内容

dwarfdump -p mybinary | awk '{print $2}'

它将生成一组带有全局符号名称的行,每行一个。

于 2009-01-12T10:54:18.097 回答
0

我喜欢 gdb 的“信息变量”来做到这一点。

此处列出: C 代码库中的全局变量标识

于 2012-06-29T18:32:47.663 回答