C代码库中的全局变量识别

时间:2009-01-12 09:56:24

标签: c linker

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

干杯

5 个答案:

答案 0 :(得分:6)

您可以使用nm从目标文件中提取此类信息。

nm *.o | grep OBJT | grep GLOB

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

nm -f [posix|bsd|sysv] *.o

答案 1 :(得分:1)

输出内存映射的选项是-M和链接器,所以要从gcc获取它,你必须使用gcc .... -Xlinker -M

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

如果您有dwarfdump并且您的二进制文件包含DWARF调试信息(未剥离),则可以通过运行

查看.debug_pubnames DWARF部分的内容

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

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

答案 4 :(得分:0)

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

此处列出: Global Variable identification in C code base