我有一个 C 代码库,需要以编程方式识别所有使用的全局变量。我认为 gcc 可以用来生成内存映射文件,但不知道如何,这可能让我看到哪些变量是全局的?任何帮助,将不胜感激。
干杯
您可以使用nm
.
nm *.o | grep OBJT | grep GLOB
上面的EDIT
命令适用于 Solaris 的 nm(SUNWbtool 软件包)。为了便携性,nm
有一个参数来选择输出格式:
nm -f [posix|bsd|sysv] *.o
输出内存映射的选项是带有链接器的 -M,因此要从 gcc 获取它,您必须使用gcc .... -Xlinker -M
.
获得这些的另一种方法是使用该ctags
程序。它不仅可以标记可用的函数,还可以标记可用的全局变量(并且不收集静态数据,这与内存映射不同)。因为它不能编译所有东西,所以它也应该比 gcc 方法更快(如果你必须编译,你当然可以免费获得)。
为什么你需要知道这个?出于很多目的,静态数据(无论是在文件范围内还是在函数范围内)都应该与全局变量一起分组。
通常,全局变量确实显示为数据,而不是链接器映射中的代码。堆栈变量和堆分配变量没有。(当然,指向堆分配数据的指针可以是全局的;这只是 C 中指针和它所指向的内容之间的常规区别。)
如果您有dwarfdump
并且您的二进制文件包含 DWARF 调试信息(未剥离),您可以通过运行检查.debug_pubnames
DWARF 部分的内容
dwarfdump -p mybinary | awk '{print $2}'
它将生成一组带有全局符号名称的行,每行一个。
我喜欢 gdb 的“信息变量”来做到这一点。
此处列出: C 代码库中的全局变量标识