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