我很想知道是否有任何方法可以在运行时找到全局变量,就像 NSClassFromString 一样。变量 BOOL 是在静态库中定义的,我通过使用“nm”找到了名称,该名称给出了以下输出:“0001924d b _gStartSessionCalled”。在 XCode 中调试时,我可以添加一个表达式“gStartSessionCalled”,并在应用程序运行时查看值的变化。
我想要做的是找到 gStartSessionCalled 的值并更改该值。我知道这样做有点奇怪,但请忽略原因。
我很想知道是否有任何方法可以在运行时找到全局变量,就像 NSClassFromString 一样。变量 BOOL 是在静态库中定义的,我通过使用“nm”找到了名称,该名称给出了以下输出:“0001924d b _gStartSessionCalled”。在 XCode 中调试时,我可以添加一个表达式“gStartSessionCalled”,并在应用程序运行时查看值的变化。
我想要做的是找到 gStartSessionCalled 的值并更改该值。我知道这样做有点奇怪,但请忽略原因。
全局变量不是 Objective-C 特定的构造。它是纯 C 语言,您可以在知道其名称时通过声明它来访问每个全局变量
extern <type> <name>;
例如在你的情况下
extern BOOL gStartSessionCalled;
…
gStartSessionCalled = YES;
更新:
如果您在编译时不知道变量的名称,您仍然可以在运行时使用类似dlsym
. 我不知道它在 MacOS 上是否与在 Linux 上相同,但会有类似的东西。
nm 输出中的小写字母“b”
0001924d b _gStartSessionCalled
表示这gStartSessionCalled
是一个本地(非外部)符号。例如,它可以定义为
static BOOL gStartSessionCalled;
在你的图书馆。据我所知,您无法从定义它们的目标文件外部访问本地符号。
调试器可以使用符号表来查找地址并显示变量,但链接器拒绝链接来自不同目标文件的本地符号。