我有一个C代码库,需要以编程方式识别所有使用的全局变量。我认为gcc可以用来生成一个内存映射文件,但不知道怎么样,这可以让我看到哪些变量是全局的?任何帮助将不胜感激。
干杯
答案 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的“信息变量”来做到这一点。