如何确定某些c库(.a)的源代码是否使用全局变量?有没有可以解析这些细节的工具?
答案 0 :(得分:0)
库包含模块(已编译的C文件)。模块可以声明全局变量。引用全局变量的任何模块(库内部或外部)都将导致声明全局变量的模块包含在构建中。
全局变量可以是static
。然后只能在该模块中看到它。
全局变量可以是extern
。这意味着它在当前模块中不存在,并且根本不存在于库中,在这种情况下用户必须提供变量。
在第一种和第三种情况下,变量将列在库的符号表中或库的修正表中。第一个是被调用者可用的符号列表;第二个变量列表,其确切地址仍必须在加载时固定。可能存在必须修复但未导出的变量。符号始终包含名称,不需要使用其名称列出修复程序。
因此,查看库的符号表的工具可能是您可以回答问题的工具。
注意:全局变量列在库的符号表中这一事实并不意味着变量是由库中的任何函数使用。
答案 1 :(得分:0)
手动:
如果您已经知道如何打开.a文件,请查看它。
如果在文件中,则有:
在没有声明的情况下使用变量(因此它在另一个文件中定义)
从每个函数
所以这个文件包含全局变量。
按工具:
每个编译器都有这个选项(我相信)
例如:
使用GCC,使用GDB,键入info variables
列出所有全局变量。
使用VS,打开类视图,找到全局函数和变量