c库中的全局变量

Global variables in c library

如何确定某些c 库(.a) 的源代码是否使用了全局变量?有什么工具可以解析这些细节吗?

库由模块(编译的 C 文件)组成。一个模块可以声明一个全局变量。引用全局变量的任何模块(库内部或外部)都会导致声明全局变量的模块包含在您的构建中。

全局变量可以是static。然后它只在该模块中可见。

全局变量可以是extern。这意味着它不存在于当前模块中,并且根本不存在于库中,在这种情况下,用户必须提供变量。

在第一种和第三种情况下,变量将列在库的符号table 或库的修正table 中。第一个是被调用者可用的符号列表;第二个变量列表,其确切地址必须在加载时固定。可能存在必须修复但未导出的变量。符号始终包含名称,修复不需要与其名称一起列出。

所以一个查看库符号table的工具大概可以回答你的问题。

注意:全局变量在库的符号 table 中列出并不意味着该变量被库中的任何函数使用

手工:

如果您已经知道如何打开 .a 文件,请看一看。

如果文件中有:

  • 没有声明就使用了一个变量(所以在另一个文件中定义)

  • 每个函数声明一个变量

所以这个文件包含全局变量。

按工具:

每个编译器都有适合你的选项(我相信)

例如:

使用 GCC,使用 GDB,键入 info variables 列出所有全局变量。

用VS,打开Class视图,找到全局函数和变量